如何仅针对特定类型的元素进行迭代?

时间:2013-01-20 18:19:18

标签: java oop

我有一个数组列表:

private List<GameObject> gameObjects = new CopyOnWriteArrayList<GameObject>();

GameObject可以是3个类别中的一个:SpaceshipBeamAsteroid。它们都很相似所以我将它们保存在一个数组中。然而,太空飞船有另外的方法射击,在其他线程中每100ms使用一次(称为ShootRunnable)。所以我想只在Spaceship上进行迭代,因为其他人没有实现射击方法。实现这一目标的最佳方法是什么?

for (GameObject ob : gameObjects) {
  if (ob instanceof Spaceship) {
    ob.shoot();
  }
}

我可以使用上面的内容迭代它吗?只是使用演员或其他什么?请帮忙。

5 个答案:

答案 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();
    }
}

BeamAsteroid,您可以保留方法performAction

然后,您可以进行交流:

for (GameObject ob : gameObjects) {
  ob.performAction();
}