在Java中迭代父类的ArrayList时使用Subclass方法

fvg*_*vgs 2 java methods arraylist instanceof

在这个循环中,我迭代一个类型的ArrayList Entity,它包含Entity类型的对象以及Projectile类型的对象,它扩展了Entity.如果对象是Projectile的实例,我希望执行下面的代码.但是,该getVelocity()方法仅在子类Projectile中,而不在Entity中.所以我无法编译下面的代码.

我可以想办法解决这个问题,比如使用单独的ArrayLists.但是,重点是将所有实体保留在全局列表中而不是将它们分开.有这个问题的简单解决方案,还是我需要更改代码的结构?

for (Entity f: glo.getList()) {
           if (f instanceof Projectile)
              f.setX(f.getVelocity()/rawFPS);
        }
Run Code Online (Sandbox Code Playgroud)

us2*_*012 5

这似乎是一个循环,以某种方式更新您的实体游戏引擎的每个滴答.

在我看来,更清洁的解决方案是:

class Entity {
  ...
  public void update() {}
  ...
}

class Projectile extends Entity {
  ...
  @Override
  public void update() {
    setX(velocity/rawFPS);
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

我不知道你的建筑,你可能需要或不需要传递rawFPS给你update().(正如@Naveen非常正确地指出的那样,这不是很干净,所以如果可以,请避免它).此外,如果您Entity的摘要没有任何功能,请考虑将其作为interface首选.

  • +1这是一种很好的面向对象的方法.当对象知道如何更新/渲染时,如果需要,可以通过使用内部/非标准API来获益. (2认同)