转换对象并使用所有覆盖方法而不使用if语句

时间:2011-06-14 17:02:38

标签: java casting

这是我简单的类图

https://lh5.googleusercontent.com/-2Sgqhmq4o_I/TfeQ2KeJiYI/AAAAAAAAAaw/RhIqPGynYhY/s800/ClassDiagram1.jpg

    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

3 个答案:

答案 0 :(得分:1)

此处没有足够的代码来确定您是否已完成此操作,但必须满足以下条件才能获得所需的行为:

  1. Bison和Super Bison必须继承或延伸到普通班级。
  2. 公共类必须至少抽象地定义Bison和SuperBison共享的方法。
  3. Bison和SuperBison必须覆盖公共类的方法。
  4. 您使用的'player'变量应该是普通类的类型。
  5. 满足这些要求,多态性应该在你身边。

答案 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)

您的对象playerif语句的范围内声明,并且不再存在您调用player.isAlive()的位置。此外,根据您的图表,继承树中的所有类都没有定义isAlive()getState()

此外,正如DJ Quimby所述,您的Creature课程可以定义您要调用的方法,您可以在BisonSuperBison中覆盖它们,以便为其提供特定功能。< / p>