我要創建的數據結構來捕獲以下思路:正在用靜態塊錯誤操作覆蓋靜態字段?
在一場比賽中,我希望有一個通用的Skill
類,像捕捉技能ID的一般信息,降溫時間,法力消耗等
然後我想要具備定義實際交互和行爲的特定技能。所以這些都會從基類Skill
延伸。
最後,每個球員都會有這些特殊技能的情況下,這樣我就可以檢查每個玩家的技能狀態,玩家是否用它最近,等
所以,我有一個抽象超Skill
定義一些靜態變量,所有技能都有共同之處,然後對於每個延伸Skill
的個人技能,我都使用靜態塊來重新分配靜態變量。所以我有以下模式:
class A {
static int x = 0;
}
class B extends A {
static {
x = 1;
}
}
...
// in a method
A b = new B();
System.out.println(b.x);
上面的打印1,這正是我想要的行爲。我唯一的問題是系統抱怨我以非靜態方式訪問靜態變量。但是我當然不能以這種方式訪問它,因爲我只想把技能看作Skill
而不知道它是哪個子類。所以我不得不在每次做這個時都壓制這個警告,這讓我想到這裏是否有更好的/更漂亮的設計模式。
我曾經想過問題非靜態使得變量,而是因爲他們要跨越特定技能的所有實例是靜態的,我覺得這應該是一個靜態變量...
如果每個技能的子類都有自己的x的值,那麼你應該有一個每個子類中的靜態'x'字段。原樣,加載類B將A.x設置爲1.使x變量最終確定。如果你想以多態的方式訪問一個變量值,那麼你應該在每個類中都有一個非靜態的'getX()'方法。它是否總是返回相同的常量值是一個實現細節。 –
問題是......你不改變特定技能的所有實例,而是改變所有技能的所有實例,因爲你改變了類'A'中的屬性(我認爲它是你的'AbstractSkill'類)。因此對於所有擴展了'A'的類,'x'是'1'。我傾向於使用接口來提供技能,定義所需的方法並隱藏實現細節。你可以有一些'public int getX()'而不關心實現。 – Turing85
這只是一個完整的擱置,但我會完全分開這兩件事:我有一個'SkillInfo'類/枚舉,其中包含有關技能的所有通用信息(名稱,描述,先決條件等) ,技能不會延伸,每個人都有一個實例。你可以創建獨立的類來實現技能行爲,每種技能一個。 – biziclop