这是我简单的类图
if (exit.isPressed()) {
stop();
}
//I want to casting this Sprite depent on their subclass
Sprite temp=map.getPlayer(); //This return Sprite object
//like this:
if(temp instanceof Bisona)
Bison player=(Bison) map.getPlayer();
else
SuperBison player=(SuperBison) map.getPlayer();
if(message==PLAYING){
//I got error on this line
//I know why i got that error. Coz i dont declare player.
//And java don't know what player object exactly? is Bison/SuperBison
if (player.isAlive() && player.getState()==Sprite.STATE_NORMAL) {
float velocityX = 0;
if (moveLeft.isPressed()) {
velocityX-=player.getMaxSpeed();
}
if (moveRight.isPressed()) {
velocityX+=player.getMaxSpeed();
}
if (jump.isPressed()) {
//My aim is to call this line without if that object
player.jump(false);
}
if (attack.isPressed()){
//My aim is to call this line without if that object
player.attack();
}
player.setVelocityX(velocityX);
}
}
else
{
//Set Velocity to zero
player.setVelocityX(0);
}
这可能吗?
由于
抱歉我的英文不好:D
答案 0 :(得分:1)
此处没有足够的代码来确定您是否已完成此操作,但必须满足以下条件才能获得所需的行为:
满足这些要求,多态性应该在你身边。
答案 1 :(得分:1)
如果我理解正确,Bison和SuperBison有相同的方法。然后你只需将玩家投射到Bison,然后调用Bison方法。
你似乎误解了施法。在Java中,转换(对于引用类型)永远不会更改对象的类型,它只会更改编译器对对象引用的看法。 该对象仍然保持不变,并且在运行时,VM实际上检查这确实是一个合适的对象。
下面
if(temp instanceof JabangTetuka) {
Bison player=(Bison) map.getPlayer();
}
else {
SuperBison player=(SuperBison) map.getPlayer();
}
您正在创建两个不同类型的player
个变量,每个变量仅在周围的{...}
块中有效。 (即使您的代码中没有括号,块仍然存在。)
因此,您根本无法使用该变量。
如果您的播放器已经是野牛,那么您只需编写
即可Bison player = (Bison) map.getPlayer();
但我不知道你的玩家将是Sprite,JabangTetuka和Bison的全部,或者你有一个非常奇怪的继承关系。
答案 2 :(得分:0)
您的对象player
在if
语句的范围内声明,并且不再存在您调用player.isAlive()
的位置。此外,根据您的图表,继承树中的所有类都没有定义isAlive()
或getState()
此外,正如DJ Quimby所述,您的Creature
课程可以定义您要调用的方法,您可以在Bison
和SuperBison
中覆盖它们,以便为其提供特定功能。< / p>