2015-12-03 110 views
0

對不起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 
+2

'takeTurn'不是'static',你必須在'GameCharacter'的實例上調用它,它不應該是'player.takeTurn',但是,我不知道爲什麼你會傳遞另一個'GameCharacter 「對它? – MadProgrammer

+0

查看java的繼承主題 – Ahmed

+0

該代碼無法編譯 –

回答

0

在Java中,所有繼承自父傳遞到子類,包括實例變量和方法。

意思是說,如果你想用「子類參數」「調用超類方法」,你只需在子類中創建一個對象並調用你的方法即可。


例如,在你的超類,你有

public abstract void takeTurn(GameCharacter character);

而且你,假設,GameCharacter的兩個子類:

public class Player extends GameCharacter { ... } 

public class Enemy extends GameCharacter { ... } 

現在,如果你想叫takeTurn用一個Player參數或一個Enemy參數,你會把它們放在它們各自的子類中。

//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 
    } 
} 

An abstract method is NOT defined until you specifically define it in each respective subclass.

You can think of an abstract class (methods, too) as a blueprint for a class.

換句話說,因爲這兩個PlayerEnemyGameCharacter子類和takeTurn(GameCharacter character)是一個抽象的方法,你可以創建並在每個單獨的類調用takeTurn

注:爲了使您致電takeTurn(...):你可以這樣做是因爲抽象方法takeTurn需要GameCharacter,都PlayerEnemy延長GameCharacter


編輯主要沒有創建一個對象,你必須使takeTurn static

一般慣例建議你製作一個GameCharacter對象new,並通過該對象調用takeTurn(...),因爲我相信你會想要多個字符。

+0

謝謝你的迴應。我已經在相應的子類中完成了它,但它不會讓我訪問這些方法。 – Klate

+0

它不會讓你訪問什麼類的方法?請清楚(: – CodeSammich

相關問題