对不起,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
答案 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 定义,直到您在每个相应的子类中明确定义。
您可以将 抽象 类(方法也可以)视为类的蓝图。
换句话说,由于Player
和Enemy
都是GameCharacter
的子类,而takeTurn( GameCharacter character)
是抽象方法,因此您可以创建并调用takeTurn
在每个班级。
注意:您可以这样做,因为抽象方法takeTurn
需要GameCharacter
,而Player
和Enemy
都会延长GameCharacter
编辑:为了在不创建对象的情况下在main中调用takeTurn(...),您必须进行takeTurn static
。
一般做法建议您使用GameCharacter
制作new
对象,并通过该对象调用takeTurn( ... )
,因为我相信您需要多个字符。