0

我有一个班级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 是 type Soldier,这是正确的,因为我将对象存储Soldier在 List 中ListUnits1Player1

但是为什么我不能调用update()Soldier 类的方法呢?

我想我可以明确地unit1_player1转换为Soldierwith((Soldier)unit1_player1).update();但由于它是可变的,存储在哪个单位(士兵、坦克、...)中,ListUnits1Player1我不想将它转换为某种类型。

我试过铸造:

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

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

有什么建议么?

4

4 回答 4

2

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

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

于 2018-08-19T11:34:44.390 回答
1

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

//superclass
public abstract void update ();

然后在每个子类中覆盖它

//subclass
public void update (){
    //code
}
于 2018-08-19T11:42:36.847 回答
1

如果你不能调用unpdateSprites意味着你没有update在超类中声明方法或将其声明为私有。

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

class Sprites {
    void update() {

    }
}

class Tank extends Sprites {

    @Override
    void update() {
        // ...
    }
}
于 2018-08-19T11:38:22.500 回答
0

你在 s 上声明了一个迭代器Sprite,所以从编译器的角度来看,你可以处理它的任何子类型,但是没有办法知道哪个

如果您的集合中只有update支持.SoldierTank

于 2018-08-19T11:39:25.377 回答