我有一个数组列表:
private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>();
GameObject
可以是3个类别中的一个:Spaceship
,Beam
和Asteroid
。它们都很相似所以我将它们保存在一个数组中。然而,太空飞船有另外的方法射击,在其他线程中每100ms使用一次(称为ShootRunnable
)。所以我想只在Spaceship
上进行迭代,因为其他人没有实现射击方法。实现这一目标的最佳方法是什么?
for (GameObject ob : gameObjects) {
if (ob instanceof Spaceship) {
ob.shoot();
}
}
我可以使用上面的内容迭代它吗?只是使用演员或其他什么?请帮忙。
答案 0 :(得分:2)
你所使用的路径在技术上是可行的,但一个好的经验法则是,如果你开始使用反射,你可能做错了什么。在这种情况下,拥有两个集合可能是最明智的,一个用于所有游戏类型,另一个用于太空飞船。
答案 1 :(得分:2)
在你的游戏中,是否有定期发生的其他行为?
如果是这样,您可以将shoot()
方法更改为抽象方法(可以命名为periodicAction()
)并将其放在GameObject
类中。 Spaceship
类通过射击实现此方法,另一个类具有特定的周期性行为,而Asteroid
类则不执行任何操作。
答案 2 :(得分:0)
你应该将你的shoot()方法放入Spaceship类中,因为没有asteriod或beam会使用这种方法。完成此操作后,您还应至少保留两个集合。其中一个应该只包含你的宇宙飞船。
答案 3 :(得分:0)
我宁愿这样做:
Iterator<Spaceship> getSpaceships(){
// return Iterator over Spaceship objects through use of instanceof
}
...
Iterator<Spaceship> it = getSpaceships()
while(iter.hasNext()) it.next().shoot()
对我来说,它看起来更清楚。
答案 4 :(得分:0)
您可以在Action
:
GameObject
或方法
public interface Action {
void performAction();
}
public abstract class GameObject implements Action {
//...
public void performAction() {
// subclasses should override this method.
// otherwise, it will do nothing.
}
}
然后实施Spaceship
:
public class Spaceship extends GameObject {
@Override
public void performAction() {
this.shoot();
}
}
要Beam
和Asteroid
,您可以保留方法performAction
:
然后,您可以进行交流:
for (GameObject ob : gameObjects) {
ob.performAction();
}