java - Java中迭代父类ArrayList时使用子类方法

标签 java methods arraylist instanceof

在此循环中,我迭代 Entity 类型的 ArrayList,其中包含 Entity 类型的对象以及扩展 Entity 的 Projectile 类型的对象。如果对象是 Projectile 的实例,我希望执行以下代码。但是,getVelocity() 方法仅在子类 Projectile 中存在,在 Entity 中不存在。所以我无法编译下面的代码。

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

for (Entity f: glo.getList()) {
           if (f instanceof Projectile)
              f.setX(f.getVelocity()/rawFPS);
        }

最佳答案

这似乎是一个循环,每次游戏引擎运行时都会以某种方式更新您的实体。

在我看来,更干净的解决方案是:

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

class Projectile extends Entity {
  ...
  @Override
  public void update() {
    setX(velocity/rawFPS);
  }
  ...
}

我不知道您的架构,您可能需要也可能不需要将 rawFPS 传递给 update()。 (正如 @Naveen 非常正确地指出的那样,这不是很干净,所以如果可以的话避免它)。此外,如果您的实体是抽象的,本身没有任何功能,请首先考虑将其设为接口(interface)

关于java - Java中迭代父类ArrayList时使用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14421259/

相关文章:

objective-c - 用户按下主页按钮时中断方法?

java - 从 Scanner 添加多个数据类型元素到 ArrayList

android - 使用 arraylist<string> 为 android 中的自动完成 TextView 设置适配器

c# - 如何创建起始索引为 1(而不是 0)的 ArrayList

java - from Constructor 通过反射提取参数类型

java - java方法中的最终参数

java - 将新的 JavaDoc 附加到来自 super 方法的现有 JavaDoc

java - 将控制台输出写入 .txt 文件

java - Android Studio - Java 库上的 MinSdkVersion

Java.util.logger 不断写入新的日志文件