2012-05-17 13 views
10

Si consideri la seguente classechiamata metodo di classe Super automaticamente

class A{ 
    public void init(){ 
     //do this first; 
    } 
    public void atEnd(){ 
     //do this after init of base class ends 
    } 
} 

class B1 extends A{ 

    @Override 
    public void init() 
    { 
     super.init(); 
     //do new stuff. 
     //I do not want to call atEnd() method here... 
    } 
} 

Ho diversi B1, B2, ... Bn classi figlie che sono già sviluppate. Tutti loro estendono la classe A. Se voglio aggiungere una nuova funzionalità in tutti loro, il posto migliore per farlo è definirlo in un metodo all'interno della classe A. Ma la condizione è che il metodo debba sempre essere chiamato automaticamente prima il metodo init() della classe child termina. Un modo semplice per farlo è di aggiungere nuovamente la chiamata al metodo atEnd() al termine del metodo init() delle classi child. Ma c'è un altro modo per farlo in modo intelligente ??

risposta

19

Un modo per farlo è facendo init() finale e delegando il suo funzionamento ad un secondo, override , il metodo:

abstract class A { 
    public final void init() { 
    // insert prologue here 
    initImpl(); 
    // insert epilogue here 
    } 
    protected abstract void initImpl(); 
} 

class B extends A { 
    protected void initImpl() { 
    // ... 
    } 
} 

Ogni volta che qualcuno chiama init(), il prologo ed epilogo vengono eseguiti automaticamente, e le classi derivate non lo fanno devo fare una cosa.

3

Fai init()final, e forniscono un metodo separato per le persone di ignorare che init() chiamate al centro:

class A{ 
    public final void init(){ 
     //do this first; 
    } 

    protected void initCore() { } 

    public void atEnd(){ 
     //do this after init of base class ends 
    } 
} 

class B1 extends A{ 

    @Override 
    protected void initCore() 
    { 
     //do new stuff. 
    } 
} 
4

Un altro pensiero sarebbe quello di tessere in un aspetto. Aggiungi prima e dopo il consiglio a un punto.

+0

Se si tratta di proteggere gli invarianti di classe, AOP sarebbe una soluzione molto scarsa. –

+0

Si tratta di "fare cose"; invarianti non sono menzionati. E non sono sicuro che "molto povero" sia appropriato, in base alle informazioni fornite. – duffymo

Problemi correlati