我有一个类Sprites
和一个类Soldier
,Tank
,依此类推。 Soldier
和Tank
扩展了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'
有什么建议吗?
答案 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
的对象,则应为该方法声明一个接口,使Soldier
和Tank
都实现它,然后对您的方法进行辩论包含该接口类型的对象。