2015-12-03 86 views
1

我剛剛發佈了關於抽象方法,我認爲這是它不能編譯的原因。方法不是抽象的,也不會覆蓋方法

超類

public abstract class Monster extends GameCharacter { 

    public abstract int getxP();  
    protected int monsterXP; 

    public Monster(String name, int health, int attack, int xp) { 
     super(name, health, attack); 
     this.monsterXP = xp; 
    } 

我的子類

public class Goblin extends Monster { 

    public Goblin(String name, int health, int attack, int xp){ 
     super(name, health, attack, xp); 
    } 

    public Goblin(){ 
     this("Goblin", 70, 15, 2); 
    } 
} 

error:Goblin is not abstract and does not override abstract method getxP() in Monster

所以我不知道這是怎麼回事這裏的代碼是在方面構造超類GameCharacter相同。我不明白爲什麼XP不同於名稱,健康和攻擊。

爲清楚起見,我怎麼安排我的超類

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; 
    } 
} 
+1

你需要重寫'getxP();'in 'Goblin'如果你擴展一個'abstract'類,你必須'覆蓋'所有'ABSTRACT'方法。 – 3kings

+2

我認爲這個錯誤是不言自明的,哪部分編譯錯誤消息不理解? 「錯誤:Goblin不是抽象的,並且不會在Monster中覆蓋抽象方法getxP()」 – alfasin

回答

2

所以GameCharacterabstract class,有abstract方法。

Monsterabstract class並且具有abstract方法。

而地精是一個具體的class,應該實現任何超類沒有實現的abstract方法。我懷疑getxP()恰恰是編譯器遇到的第一個缺失並在此之後失敗的。如果你實現了getxP(),其他缺失的方法也應該導致編譯錯誤,假設它們還沒有在我們沒有看到的代碼中實現。

要回答以代碼的形式,Goblin需要看起來像這樣:

public class Goblin extends Monster { 

    public Goblin(String name, int health, int attack, int xp){ 
     super(name, health, attack, xp); 
    } 

    public Goblin(){ 
     this("Goblin", 70, 15, 2); 
    } 

    @Override 
    public int getxP() { 
     return monsterXP; 
    } 

    @Override 
    public String getName() { 
     return gameCharacterName; 
    } 

    @Override 
    public int getHealth() { 
     return gameCharacterHealth; 
    } 

    @Override 
    public int getAttackPower() { 
     return gameCharacterAttack; 
    } 
} 

然而,正如@ Dromlius的回答表明,你應該在各自的類別來實現這些。

+0

謝謝。我試過了,但仍然有相同的錯誤。我以@Dromlius的身份說過,並且說它不是抽象的。它似乎現在工作 – Klate

1

製作抽象方法意味着你要在一個子類中實現它。在你的情況下,你將你的get方法聲明爲抽象的,這在你的場景中毫無意義。

而是寫的:

public abstract int getXX(); 

寫:

public int getXX() { 
    return XX; 
} 

它不抱怨的攻擊,健康ECT在你的怪物級的,因爲你聲明的怪獸級抽象爲好,基本上說:「我知道這個類中有抽象方法(部分繼承自GameCharacter),但是我會在下一個非抽象子類中實現它們(在你的情況下爲Goblin)

如果你想保持你的方法抽象,你必須在你的非抽象子類(Goblin)中實現所有抽象超類的所有抽象方法(GameChar & Monster)

+0

謝謝你真的幫助。謝謝你的解釋。 – Klate

相關問題