2012-04-15 67 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它不能在子类中重写。当然,如果你不给一个方法一个定义,任何(具体的)子类都必须实现它。