试图调用超类方法,但传递子类的参数?

时间:2015-12-03 03:38:23

标签: java inheritance

对不起,Java新手可能没有描述它。创建基于文本的冒险

基本上我有一个名为GameCharacter的超类。两个子类Player和Monster。怪物有四个子类Ork,Troll,Goblin和Boss

我在超类中找到了一个名为takeTurn()的抽象方法。我在子类中有充实的方法。因此,当涉及到轮流调用时,我怎么知道它将访问正确的子类?

我的超级班

public abstract class GameCharacter{

    public abstract String getName();
    public abstract int getHealth();
    public abstract int getAttackPower();

   protected String gameCharacterName;
   protected int gameCharacterHealth;
   protected int gameCharacterAttack;

     public GameCharacter(String name, int health, int attack){
            this.gameCharacterName = name;
            this.gameCharacterHealth = health;
            this.gameCharacterAttack = attack;
     }

    public abstract void takeTurn(GameCharacter character);

我的轮流方法

public static void runCombatLoop(Monster monster){

    while (isPlayerAlive()&& isMonsterAlive(monster))
    {
        GameCharacter player = new Player();
        Monster enemy = new Monster(){};
        enemy.Monster();

        GameCharacter.takeTurn(player);
        GameCharacter.takeTurn(enemy);
    }


}// run combat loop end

1 个答案:

答案 0 :(得分:0)

在Java中,所有继承都从超类传递到子类,包括实例变量和方法。

意思是,如果你想用“子类参数”“调用超类方法”,你只需在子类中创建一个对象并调用你的方法。

例如,在您的超类中,您有

public abstract void takeTurn(GameCharacter character);

假设你有两个GameCharacter的子类:

public class Player extends GameCharacter { ... }

public class Enemy extends GameCharacter { ... }

现在,如果您想使用Player参数或Enemy参数调用takeTurn,您可以将它们放在各自的子类中。

//In Player.java
public class Player extends GameCharacter {
    //instance variables

    //methods (only takeTurn shown)
    void takeTurn( Player p ) {
         //take turn definition for Player here
    }
}

//In Enemy.java
public class Enemy extends GameCharacter {
    //instance variables

    //methods (only takeTurn shown)
    void takeTurn( Enemy e ) {
         //take turn definition for Enemy here
    }
}
  

抽象方法 NOT 定义,直到您在每个相应的子类中明确定义

     

您可以将 抽象 类(方法也可以)视为类的蓝图

换句话说,由于PlayerEnemy都是GameCharacter的子类,而takeTurn( GameCharacter character)是抽象方法,因此您可以创建并调用takeTurn在每个班级。

注意:您可以这样做,因为抽象方法takeTurn需要GameCharacter,而PlayerEnemy都会延长GameCharacter

编辑:为了在不创建对象的情况下在main中调用takeTurn(...),您必须进行takeTurn static

一般做法建议您使用GameCharacter制作new对象,并通过该对象调用takeTurn( ... ),因为我相信您需要多个字符。