2012-04-15 83 views
0

如何使用設計模式定義抽象類中的抽象方法,而某些方法的方法將可能到覆蓋或更改它在子類中的行爲? 在這個例子中,public abstract class GameCharacter有方法attack這應該是模式像(定義GameCharacter中的一些方法和一些留空,要在子類中重寫*)。用抽象方法定義模式設計風格的抽象類

public abstract class GameCharacter{ 

public void attack(GameCharacter opponent){ 

while(opponent.hitPoints > 0 && this.hitPoints > 0){ 

// some abstract method which behavior can be *redefined* 
//if specific class is *overrides* 
// some of this functions 
// it should be pattern design 

public void doDamageToOpponent{ 

doAttackOne(){ .... }; // cannot change 
doAttackTwo(); // can change, be overridden in child class 

} 

public void doDamageToThis{ // counterattack 

doAttackOne(){ .... }; // cannot change 
doAttackTwo(); // can change, be overriden in child class 

} 

} 

回答

2

我猜你想要的東西是這樣的:

public abstract class GameCharacter{ 

    protected abstract doAttackTwo(); 

    protected final doAttackOne() { ... implement here ... } 

    ... 
} 

doAttackTwo()必須由子類實現,而doAttackOne()不能被重寫。

+0

爲什麼* protected abstract doAttackTwo(); *是否受保護? – 2012-04-15 12:49:53

+1

'protected'表示只有這個類'GameCharacter'及其所有子類都可以訪問該方法,因此它受到來自代碼中其他點的訪問的「保護」。如果你不想要這個,你可以將它們聲明爲「public」;在這種情況下,您可以從代碼中的每個點調用這兩種方法。一般來說,如果你真的需要擁有它,那麼只允許訪問成員是明智的,所以我使用'protected'而不是'public'。 – Anthales 2012-04-15 12:52:30

+0

保護也可以從同一包中的任何類訪問,即使它們不是GameCharacter的子類。 – assylias 2012-04-15 12:56:51

0

如果您聲明一個方法爲final它不能在子類中重寫。當然,如果你不給一個方法一個定義,任何(具體的)子類都必須實現它。