如何从列表访问子类对象的方法

How to access a method of an subclass object from a List

我有一个class Sprites 和一个class Soldier, Tank 等等。 SoldierTank 扩展了 Sprites。现在 subclasses 有一个特殊的 update() 方法,每个 class 都不同(比如不同的运动等等)。

我有一个 List<Sprites> ListUnits1Player1 的所有对象,例如存储士兵以及存储所有坦克对象的 List<Sprites> ListUnits2Player1。这些列表的类型为 <Sprites>。现在请看下面的代码:

        for(Iterator<Sprites> itr_unit1_player1 =     ListUnits1Player1.iterator();itr_unit1_player1.hasNext();) {
        Sprites unit1_player1 = itr_unit1_player1.next();
        unit1_player1.update();
    }

我收到无法解析方法的错误 update()

然而,调试器告诉我,unit1_player1 是 Soldier 类型,这是正确的,因为我将 Soldier 的对象存储在列表 ListUnits1Player1 中。

但是为什么我不能调用 class 士兵的方法 update()

我想我可以使用 ((Soldier)unit1_player1).update();unit1_player1 显式转换为 Soldier,但由于存储在 [=25 中的单位(士兵、坦克等)是可变的=] 我不想将其转换为特定类型。

我试过投射:

unitClass = unit1_player1.getClass();
((unitClass)unit1_player1).update(); 

总是得到正确的 class,但这只会给我错误 Unknown class 'unitClass'

有什么建议吗?

您可以将父 class Sprites 中的方法 update 作为抽象方法移动。

然后子classes 将不得不覆盖该方法,unit1_player1.update(); 将在没有任何转换的情况下工作。

如果你不能在Sprites上调用unpdate,意味着你没有在超级class中声明update方法或将其声明为私有。

使用override注解永远是个好习惯:

class Sprites {
    void update() {

    }
}

class Tank extends Sprites {

    @Override
    void update() {
        // ...
    }
}

您在 Sprites 上声明了一个迭代器,因此从编译器的角度来看,您可以处理它的任何子类型,但无法知道是哪个

如果您的集合中只有支持 update 的对象,您应该为该方法声明一个接口,让 SoldierTank 实现它,然后辩论您的集合是否包含该接口类型的对象。

将你的 update 方法作为抽象放在 Sprites class.

//superclass
public abstract void update ();

然后在每个子class

中覆盖它
//subclass
public void update (){
    //code
}