2012-05-17 12 views
10

Rozważmy następujące klasyZadzwoń Super metoda klasy automatycznie

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

Mam kilka B1, B2, ... Bn zajęcia dla dzieci, które są już opracowane. Wszystkie z nich rozszerzają klasę A. Jeśli chcę dodać nową funkcjonalność we wszystkich z nich, najlepszym miejscem do tego jest zdefiniowanie, że w metodzie w klasie A. Ale warunkiem jest, że metoda powinna zawsze być wywoływana automatycznie tuż przed kończy się metoda init() klasy potomnej. Jednym z podstawowych sposobów, aby to zrobić, jest ponowne dodanie wywołania metody atEnd() na końcu metody init() klas potomnych. Ale czy istnieje inny sposób, aby to zrobić elegancko?

Odpowiedz

19

Jednym ze sposobów, aby to zrobić poprzez init() końcowego i przekazaniu jej działanie na sekundę, przeciążać metoda:

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

gdy ktoś nazywa init(), a epilog prolog są wykonywane automatycznie, a klasy pochodne nie robić muszę coś zrobić.

3

Bądź init()final i zapewnić oddzielny sposób dla ludzi, aby zastąpić że init() wzywa w środku:

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

Inną myślą byłoby splot w aspekcie. Dodaj przed i po poradę do punktu.

+0

Jeśli chodzi o ochronę niezmienników klas, AOP byłoby bardzo złym rozwiązaniem. –

+0

Chodzi o "rób rzeczy"; niezmienniki nie są wymienione. I nie jestem pewien, czy "bardzo słaba" jest odpowiednia, na podstawie dostarczonych informacji. – duffymo

Powiązane problemy