2 回答

TA貢獻1810條經驗 獲得超4個贊
你有兩個選擇:
一旦你知道該生物是否是食肉動物,就可以施放它并訪問該方法
創建一個具有相同“簽名”的方法,即相同的名稱和參數。
第二種選擇更優雅。使用多態的“魔法”,每個類都會調用它的方法,你不需要用 isCarnivore() 方法檢查類。但是您需要從圖塊中獲取生物列表。

TA貢獻1809條經驗 獲得超8個贊
isCarnivore()當您操作Creature基類的聲明類型時,該測試不會讓您強制轉換為子類類型:
for (Creature creature : creatures) {
if (creature.isCarnivore()) {
((CarnCreature)creature).update(creatures);
} else {
creature.update(tiles.get(creature.x).get(creature.y));
}
}
所以isCarnivore()看起來無助的if (instanceof CarnCreature)會產生同樣的效果和后果。
這是問題嗎,我是否需要將它們存儲在單獨的列表中?
這會更好,因為您不想以統一的方式操縱它們。
使用基類將它們分組在一個唯一的 List 中會使您的任務更加困難。
但實際上你有一個更深層次的問題。這里eat()不是重載方法,而是子類中的重載方法。同樣的事情update()。這意味著在這兩種情況下,這兩個方法都在子類中定義。
這樣的設計不允許從多態特性中受益,因為您想要調用基類實例上的第一個方法并調用子類實例上的重載方法。
從概念上講,食肉動物不是生物。他們的行為類型非常不同:一個消耗一個東西(一個瓷磚),另一個消耗一個非常不同的東西(一個生物列表)。
為了從多態中受益,您應該重新設計基類和子類以覆蓋方法而不是重載它們。但是當你在參數中傳遞真正不同的類型時,你會被卡住。
所以在你的情況下,我認為我什至不會在這些類之間創建繼承關系。
添加回答
舉報