2012-04-15 2 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

Почему * защищенный абстрактный doAttackTwo(); * защищен? –

+1

'protected' означает, что только этот класс GameCharacter и все его подклассы могут получить доступ к этому методу, поэтому он« защищен »от доступа из других точек вашего кода. Если вы этого не хотите, вы можете объявить их как «public»; в этом случае вы можете вызывать оба метода из каждой точки вашего кода. В общем, может быть разумным только разрешить доступ к членам, если вам действительно нужно это сделать, поэтому я использовал 'protected' вместо' public'. – Anthales

+0

Защищенный также может быть доступен из любых классов в одном пакете, даже если они не являются подклассом GameCharacter. – assylias

0

Если объявить метод как final он не может быть переопределен в подклассе. И, конечно же, если вы не дадите метод определения, то любой (конкретный) подкласс должен его реализовать.

Смежные вопросы