3

level从实例访问字段的正确方法是Minotaur什么?得到错误for (int i =0 ; i < ((Monster) this).level ; i++)Cannot cast from Player to Monster

package player;

import monsters.*;

public class Player extends GameCharacter {

      public void performAttackOn(GameCharacter who){

    if (who instanceof Monster ){

        for (int i =0 ; i < ((Monster) this).level ; i++) { // << 

                 }

    public static  class Minotaur extends Monster{ // << nested class which is being created and there is need to access it's level

        public Minotaur () {

              type = "Minotaur";

        }
    }

}

package monsters;

public class Monster extends GameCharacter{

    public int level = 1;
}

package monsters;

public abstract class GameCharacter{

public static  class Minotaur extends Monster{

        public Minotaur(){
            type = "Minotaur";
             hitPoints = 30;
             weapon = new Weapon.Sword();

        }
    }
}

Minotaur应该在继承自的某些方法中扩展monsters.GameCharactermonsters.Monster覆盖Player.playermonsters.GameCharacter

4

4 回答 4

4

GameCharacter接口定义一个getLevel()方法,Monster两者Player都实现。

public interface GameCharacter
{
  public int getLevel( );
}

一旦你这样做了,你就利用了多态性,甚至不需要强制转换。


另外,您真的是要强制转换this为 typePlayer的类型Monster吗?或者你的意思是:

public void performAttackOn(GameCharacter who)
{
    for (int i =0 ; i < who.getLevel( ) ; i++)
    {
      // do stuff...
    }
}
于 2012-04-15T17:58:59.420 回答
1

在您定义的层次结构中, aPlayer永远不可能是 a Monster,所以演员是不可能的。

根据上面的检查,我相信您遇到问题的行应该参考who而不是this

for(int i = 0; i < ((Monster)who).level; i++)
于 2012-04-15T17:59:47.560 回答
1

这很容易。你检查是否who是一个Monter,但如果是,你施法this到Moster并this指代你目前是女巫的对象,这意味着一些玩家。替换这个

((Monster) this).level

有了这个

((Monster) who).level

并且错误应该消失。

于 2012-04-15T18:00:34.090 回答
0

编辑:现在我明白了,你不能对类的字段进行继承。你应该有一个通用的方法

pubic int level();

在你的GameCharacter. 然后,您可以选择是定义level为两个不同的子类字段(不推荐)还是只保留GameCharacter一个级别字段。

这里:((Monster) this).level你正在转换this实例,它是一个Playerto Monster。这就是你得到错误的原因。

也许你的意思是:

if (who instanceof Monster ){
  for (int i =0 ; i < ((Monster) who).level ; i++) { // << 

  }
}
于 2012-04-15T17:59:28.683 回答