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

时间:2018-08-19 11:31:00

标签: java inheritance subclass

我有一个类Sprites和一个类SoldierTank,依此类推。 SoldierTank扩展了Sprites。现在,子类具有一个特殊的update()方法,该方法在每个类中都不同(例如,不同的移动方式等等)。

我有一个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中。

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

我猜我可以用unit1_player1显式地将Soldier强制转换为((Soldier)unit1_player1).update();,但是由于它是可变的,所以存储在ListUnits1Player1中的单位(士兵,坦克等)我不想将其强制转换为特定类型。

我尝试使用以下方法进行投射:

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

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

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

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

然后,子类将必须重写该方法,并且unit1_player1.update();将无需任何强制转换即可工作。

答案 1 :(得分:1)

如果您无法在unpdate上调用Sprites,则意味着您没有在超类中声明update方法或未将其声明为私有方法。

使用override注释始终是一个好习惯:

class Sprites {
    void update() {

    }
}

class Tank extends Sprites {

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

答案 2 :(得分:1)

将您的update方法作为抽象放在Sprites类中。

//superclass
public abstract void update ();

然后在每个子类中覆盖它

//subclass
public void update (){
    //code
}

答案 3 :(得分:0)

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

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