亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有不同方法參數的 Java 子類

具有不同方法參數的 Java 子類

一只甜甜圈 2021-07-09 14:00:11
我正在嘗試進行模擬簡單生物和食肉生物的模擬。我有一個叫做生物的類和一個叫做 carnCreature 的子類。我在生物中有一個名為eat 的方法,它接收一種類型的對象,但我需要carnCreature 類中的eat 方法來接收生物列表。我嘗試將方法命名為與生物類中的命名相同,但是當我嘗試調用它時,java 不接受更新的參數。package simulationObjects;import java.awt.Color;import java.util.List;import java.util.Random;import java.lang.Math.*;public class Creature {    public int x;    public int y;    public int maxTilesX;    public int maxTilesY;    public Color color;    public float health = 50;    public int life = 0;    public Creature (int x, int y, Color color, int maxTilesX, int maxTilesY) {        this.x = x;        this.y = y;        this.color = color;        this.maxTilesX = maxTilesX;        this.maxTilesY = maxTilesY;    }    public void update(Tile tile) {        eat(tile);        life++;        health-=1;    }    public void eat(Tile currentTile) {        if (currentTile.color == this.color) {            health += 3;            currentTile.color = Color.GRAY;        }      }    public boolean isCarnivore() {        return false;    }}package simulationObjects;import java.awt.Color;import java.util.List;public class CarnCreature extends Creature{    private static final boolean CANABOLIC = false;    public CarnCreature(int x, int y, Color color, int maxTilesX, int maxTilesY) {        super(x, y, color, maxTilesX, maxTilesY);        // TODO Auto-generated constructor stub    }    public void update(List<Creature> creatures) {        eat(creatures);        life++;        health-=1;    }我試圖將生物和 carnCreatures 存儲在同一個列表中,“生物”。這是問題嗎,我是否需要將它們存儲在單獨的列表中?
查看完整描述

2 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

你有兩個選擇:

  • 一旦你知道該生物是否是食肉動物,就可以施放它并訪問該方法

  • 創建一個具有相同“簽名”的方法,即相同的名稱和參數。

第二種選擇更優雅。使用多態的“魔法”,每個類都會調用它的方法,你不需要用 isCarnivore() 方法檢查類。但是您需要從圖塊中獲取生物列表。


查看完整回答
反對 回復 2021-07-14
?
海綿寶寶撒

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()。這意味著在這兩種情況下,這兩個方法都在子類中定義。

這樣的設計不允許從多態特性中受益,因為您想要調用基類實例上的第一個方法并調用子類實例上的重載方法。

從概念上講,食肉動物不是生物。他們的行為類型非常不同:一個消耗一個東西(一個瓷磚),另一個消耗一個非常不同的東西(一個生物列表)。

為了從多態中受益,您應該重新設計基類和子類以覆蓋方法而不是重載它們。但是當你在參數中傳遞真正不同的類型時,你會被卡住。

所以在你的情況下,我認為我什至不會在這些類之間創建繼承關系。


查看完整回答
反對 回復 2021-07-14
  • 2 回答
  • 0 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號