【发布时间】:2020-03-25 11:51:49
【问题描述】:
我正在设计一个基本的游戏引擎。我有一个抽象的GameObject 类,它由Player 和Bullet 两个类继承。我正在尝试处理两个游戏对象的碰撞。如果两个碰撞的对象相同,则不会发生任何事情。如果其中一个是子弹,另一个是玩家,则玩家的生命值设置为 0。这是一个显示所需方法和类定义的 sn-p:
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 方法。如何使用更简洁的代码实现这一目标?谢谢。
【问题讨论】:
-
这种继承层次结构不太好。虽然玩家和子弹可能都是抽象意义上的“游戏对象”,但它们几乎没有共同之处。无法很好地编写方法来处理不同的游戏对象,因此您必须求助于
instanceof。这就是为什么游戏引擎倾向于使用Entity-Component-System 模型,它避免了继承(以及composition should be preferred over inheritance 无论如何)。
标签: java polymorphism instanceof