[英]How can I avoid instanceof when function behavior depends on type?
我正在設計一個基本的游戲引擎。 我有一個抽象的GameObject
類,它由兩個類Player
和Bullet
繼承。 我正在嘗試處理兩個游戲對象的碰撞。 如果兩個碰撞的對象相同,則什么也不會發生。 如果其中一個是子彈,另一個是玩家,則玩家的健康狀況設置為 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.