簡體   English   中英

當函數行為取決於類型時,如何避免 instanceof?

[英]How can I avoid instanceof when function behavior depends on type?

我正在設計一個基本的游戲引擎。 我有一個抽象的GameObject類,它由兩個類PlayerBullet繼承。 我正在嘗試處理兩個游戲對象的碰撞。 如果兩個碰撞的對象相同,則什么也不會發生。 如果其中一個是子彈,另一個是玩家,則玩家的健康狀況設置為 0。以下是顯示所需方法和類定義的片段:

public interface GameObject {
    void onCollision(GameObject gameObject);
}

public class GameObjectImpl implements GameObject {
    ...
    // By default, do nothing.
    @Override
    public void onCollision(GameObject object) {}    
}


public class Player extends GameObjectImpl {
   ...
   @Override
   public void onCollision(GameObject gameObject) {
      if (gameObject instanceof Player) {
          // Do nothing
      } else if (gameObject instanceof Bullet) {
          this.health = 0;
      }
   }
}

我想避免instanceof但我想不出任何辦法。 我想通過使用polymorphism來實現它,因為GameObject接口的客戶端不應該知道有關子彈或玩家等的詳細信息。它只會為每一幀中的對象調用onCollision方法。 我怎樣才能用更簡潔的代碼實現這一點? 謝謝你。

它可能看起來很麻煩,因為 Java 解析目標方法的機制不是最好的,但是您可以嘗試類似的方法

public class Player extends GameObjectImpl {
   ...
    @Override
    public void onCollision(GameObject gameObject) {
        gameObject.collideWith(this);
    }
}

然后使用適當的“回調”擴展GameObject

public interface GameObject {
    void onCollision(GameObject gameObject);
    void collideWith(Player player);
}

進而

public class Player extends GameObjectImpl {
   ...
    @Override
    public void onCollision(GameObject gameObject) {
        gameObject.collideWith(this);
    }

    @Override
    public void collideWith(Player player) {
        // ... do nothing, shouldn't happen
    }
}

public class Bullet extends GameObjectImpl {
   ...
    @Override
    public void onCollision(GameObject gameObject) {
        gameObject.collideWith(this);
    }

    @Override
    public void collideWith(Player player) {
        player.setHealth(0);
    }
}

為了進一步閱讀,您可以在 Java 中搜索訪問者模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM