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.GameCharacterし、monsters.Monsterオーバーライドする必要がありますPlayer.playermonsters.GameCharacter

4

4 に答える 4

4

インターフェイスに、両方が実装するメソッドをGameCharacter定義させます。getLevel()MonsterPlayer

public interface GameCharacter
{
  public int getLevel( );
}

それができたら、ポリモーフィズムを利用しているので、キャストする必要さえありません。


thisまた、 type の type を 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キャストし、あなたが現在いるウィッチのオブジェクトを参照します, それはいくつかのプレイヤーを意味します. これを交換thisthis

((Monster) this).level

これとともに

((Monster) who).level

エラーは消えます。

于 2012-04-15T18:00:34.090 に答える
0

編集:クラスのフィールドを継承することはできません。あなたは共通の方法を持っているべきです

pubic int level();

あなたのGameCharacterlevel次に、子クラスの 2 つの異なるフィールドとして定義するか(推奨されません)、そのままにGameCharacterしてレベル フィールドを持たせるかは、あなたの選択です。

ここでは、 toであるインスタンス((Monster) this).levelをキャストしています。そのため、エラーが発生します。thisPlayerMonster

多分あなたは意味した:

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

  }
}
于 2012-04-15T17:59:28.683 に答える