0

エンティティの配列リストがあります。Entityクラスには

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からprint関数を呼び出します。この時点で私はちょっと迷っています。

4

2 に答える 2

1

複数のレベルクラスがあるため、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);
    }
}

@Overrideメソッドにが必要であることを確認してくださいPlayer.update(...)。シグニチャが一致していない可能性があるため、実際に自分が思っているメソッドシグニチャをオーバーライドしていません。

他のコメントのカップル:

  • 通常、リストを処理するときはList<?>、実装ではなく、渡しますArrayList<?>

  • エンティティリストを反復処理してメソッド呼び出しに渡す場合は、updateメソッドがリストを変更していないことを確認する必要があります。変更していない場合は、をスローしConcurrentModificationExceptionます。

于 2012-09-26T19:12:47.627 に答える