2012-05-17 15 views
10

Considere la siguiente clasellamada a un método de superclase automáticamente

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... 
    } 
} 

Tengo varios B1, B2, ... Bn clases hijas que ya se desarrollan. Todos ellos amplían la clase A. Si deseo agregar una nueva funcionalidad en todos ellos, el mejor lugar para hacerlo es definir eso en un método dentro de la clase A. Pero la condición es que el método siempre se llame automáticamente antes el método init() de la clase infantil termina. Una forma básica de hacerlo es volver a agregar la llamada al método atEnd() al final del método init() de las clases secundarias. ¿Pero hay alguna otra forma de hacerlo inteligentemente?

Respuesta

19

Una forma de hacerlo es haciendo init() final y delegar su funcionamiento a un segundo, reemplazable , método:

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() { 
    // ... 
    } 
} 

Cada vez que alguien llama init(), el prólogo y el epílogo se ejecutan automáticamente, y las clases derivadas no lo hacen tiene que hacer una cosa

3

Hacer init()final, y proporcionan un método separado para las personas que tienen prioridad que init() llamadas en el medio:

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

Otro pensamiento sería tejer en un aspecto. Agregue un antes y un después a un pointcut.

+0

Si se trata de proteger invariantes de clase, AOP sería una solución muy pobre. –

+0

Se trata de "hacer cosas"; invariantes no son mencionados. Y no estoy seguro de que sea "muy pobre", según la información suministrada. – duffymo

Cuestiones relacionadas