如何从列表访问子类对象的方法
How to access a method of an subclass object from a List
我有一个class Sprites
和一个class Soldier
, Tank
等等。 Soldier
和 Tank
扩展了 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() {
// ...
}
}
您在 Sprite
s 上声明了一个迭代器,因此从编译器的角度来看,您可以处理它的任何子类型,但无法知道是哪个
如果您的集合中只有支持 update
的对象,您应该为该方法声明一个接口,让 Soldier
和 Tank
实现它,然后辩论您的集合是否包含该接口类型的对象。
将你的 update
方法作为抽象放在 Sprites
class.
//superclass
public abstract void update ();
然后在每个子class
中覆盖它
//subclass
public void update (){
//code
}
我有一个class Sprites
和一个class Soldier
, Tank
等等。 Soldier
和 Tank
扩展了 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() {
// ...
}
}
您在 Sprite
s 上声明了一个迭代器,因此从编译器的角度来看,您可以处理它的任何子类型,但无法知道是哪个
如果您的集合中只有支持 update
的对象,您应该为该方法声明一个接口,让 Soldier
和 Tank
实现它,然后辩论您的集合是否包含该接口类型的对象。
将你的 update
方法作为抽象放在 Sprites
class.
//superclass
public abstract void update ();
然后在每个子class
中覆盖它//subclass
public void update (){
//code
}