我正在编写一个游戏,并有一个名为 GameObject 的抽象类和三个扩展它的类( Player,Wall和Enemy )。
我有一个列表定义为包含我游戏中的所有对象。
List<GameObject> objects;
当我需要对对象执行某些操作时,我就是这样做的:
public void update() {
for(GameObject o : objects) {
if(o instanceof Wall) {
// do something
}
else if(o instanceof Player) {
// do something
}
else if(o instanceof Enemy) {
// do something
}
}
}
正如您所看到的,我必须浏览整个列表并检查类型以找到只是找到一个对象。在我看来,这似乎并不是非常有效。所以我考虑将不同的派生类存储在自己的列表中。
private List<Wall> walls;
private List<Enemy> enemies;
private Player player; // only one
这会更有效率而不是通过包含所有内容的整个列表并检查它的类型来决定是否做某事?非常感谢。
答案 0 :(得分:6)
执行此操作的常规方法是在GameObject上使用接口。
public interface GameObject {
void update();
}
然后让每个对象实现GameObject。
public class Player implements GameObject {
public void update() { // update player...
}
public class Wall implements GameObject {
public void update() { // probably do nothing...
}
public class Enemy implements GameObject {
public void update() { // update enemy...
}
然后你的更新循环看起来像这样。
public void update() {
for(GameObject o : objects) {
o.update();
}
}
我不能保证你这更快,但可能是。编译器可能能够像这样优化虚拟调用(虚拟调用在面向对象编程中很常见,因此编译器知道如何优化它是一件非常好的事情),而我并不认为它几乎也能够优化对实例类类型的显式检查。