好的,所以我有整個模塊負責在我的遊戲中生成玩家類,經過幾個小時和幾個小時的艱苦勞動,我想出了這個層次結構(代碼片段沒有使它太過圖形化,但仍然提供足夠的餘地)這是建立類層次結構的正確方法嗎?
我有實體(其或者是Player或怪獸)鹼接口:
public interface Entity {
public int getHP();
...
// all getters that denote all stats the Entities have in my game, nothing
else is in the interface
}
然後是第二界面延伸Entity
,稱爲Classes
,包含所有相關類制定者:
public interface Classes extends Entity {
void setHP(int a);
... //and so on}
最後有一些真正的階級,階層PlayerClasses
負責建設類:
public class PlayerClasses implements Classes {
private int HP, ATK, DEF, DAMAGE, DROP;
@Override
public int getHP() {
return HP;
}
@Override
public void setHP(int a) {
HP = a;
}
// this is how I build the player class
public void Rogue(){
setHP(150);
setATK(30);
setDEF(20);
setDAMAGE();
}
最後一類的構造函數用於創建播放器實例,然後將其傳遞到其他模塊(沒有繼承或直接訪問的任何其他類別字段或需要在構造函數中的任何狀態,所以贏吧?)
public class Player {
private int HP,ATK,DEF,DAMAGE,DROP;
private PlayerClasses c;
public Player() {
c = new PlayerClasses();
c.Rogue();
HP = c.getHP();
ATK = c.getATK();
DEF = c.getDEF();
DAMAGE = c.getDAMAGE();
DROP = c.getDrop();
}
類長的問題,但我試圖保持它的公民。任何反饋非常感謝。
編輯:好的,以澄清爲什麼我選擇這樣設計,我希望播放器實例是不可變的對象,只能使用正確的值實例化,同時保持其他模塊中的初始化儘可能沒有任何依賴關係。例如,如果模塊中的實例顯示玩家屬性和怪物屬性,則來自兩個不同玩家類的值不能混淆。我覺得在繼承中傳遞私有的HP和ATK變量,然後使用相同的變量拉動命名空間不是一種方法。
有沒有*正確*的方式,但這不是一個*好*方式,恕我直言。爲什麼不用你的'Entity'接口,然後像'Player implements Entity'這樣的類?如果你有一些共享共同價值的類,可以引入類似「玩家延伸生物」,「怪物延伸生物」,「生物實現實體」等。 –
這個問題太廣泛了。除非你澄清你爲什麼決定創建上述層次結構,以及你需要什麼建議,否則你的問題可能得不到有效答案 –
在課堂設計中沒有「錯誤」,但有「這看起來很奇怪」。你需要那麼多的接口,然後委託給隱藏的類嗎?你可以創建具有不同默認值的'Player'的子類 – zapl