0

我有一个实体数组列表。实体类有

public void update(int delta, Level level, ArrayList<Entity> entities){
    //do stuff
}

实体的子类 Player,具有覆盖它的函数

public void update(int delta, Level level, ArrayList<Entity> entities){
    //do player specific stuff
    super.update(delta, level, entities);
}

当我从实体数组列表中调用播放器对象更新函数时,如下所示:

for(Entity entity : entities)            //contains an object of Player
    entity.update(delta, level, entities);

它直接调用实体函数并且玩家特定的东西不会发生,但是如果我这样称呼它:

((Player)entities.get(0)).update(delta, level, entities);

确实如此。我以为我理解了这个问题,但我尝试了以下代码

private static class Foo{
    public void print(){
        System.out.println("I AM FOO");
    }
}
private static class Bar extends Foo{
    public void print(){
        System.out.println("i am bar");
        super.print();
    }
}
public static void main(String[] args){
    ArrayList<Foo> foos = new ArrayList<Foo>();
    foos.add(new Foo());
    foos.add(new Bar());
    for(Foo leFoo: foos)
        leFoo.print();
}

当对象是 bar 时,它实际上从 Bar 调用 print 函数。在这一点上我有点迷路了。

4

2 回答 2

1

由于您有多个 Level 类,因此您必须确保Player.update()方法签名引用正确的类(以便成功覆盖):

public class Player {

  @Override
  public void update(int delta, game.level.Level level, ArrayList<Entity> entities) { ... }
}
于 2012-09-26T19:09:16.627 回答
0

以下代码适用于我:

List<Entity> fooList = new ArrayList<Entity>();
fooList.add(new Entity());
fooList.add(new Player());
for (Entity entity : fooList) {
    entity.update(1, fooList);
}

private static class Entity {
    public void update(int delta, List<Entity> entities) {
        System.out.println("in Entity");
    }
}
private static class Player extends Entity {
    @Override
    public void update(int delta, List<Entity> entities) {
        System.out.println("in Player");
        super.update(delta, entities);
    }
}

确保你需要一个@OverrideonPlayer.update(...)方法。可能是签名不匹配,因此您实际上并没有覆盖您认为的方法签名。

其他几条评论:

  • 通常,当我们处理列表时,我们传递List<?>而不是实现ArrayList<?>

  • 如果您正在遍历实体列表并将其传递给方法调用,则需要确保更新方法没有更改列表,否则您将抛出ConcurrentModificationException.

于 2012-09-26T19:12:47.627 回答