2012-05-17 50 views
10

考虑下面的类调用父类方法自动

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

我有几个B1,B2,... BN孩子这是已经开发的类。所有这些都扩展了A类。如果我想在它们中添加一个新的功能,最好的地方是在类A中的一个方法中定义它。但是,条件是该方法应该总是在之前自动调用子类的init()方法结束。 这样做的一个基本方法是在子类的init()方法的末尾再次添加atEnd()方法调用。但有没有其他的方式来巧妙地做到这一点?

回答

19

的一种方式做,这是通过使init()最终并委托其运作到第二,重写,方法:

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

每当有人呼吁init()的序幕和尾声被自动执行,并且派生类不必须做一件事。

3

init()final,并提供一个单独的方法为人们重写init()调用中间:

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

另一个想法是编织一个方面。在切入点之前和之后添加建议。

+0

如果这是为了保护类不变量,AOP将是一个非常糟糕的解决方案。 –

+0

这是关于“做东西”;没有提到不变量。根据所提供的信息,我不确定“非常差”是否合适。 – duffymo