考虑以下课程
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()方法调用。但有没有其他方法可以做到这一点?
答案 0 :(得分:19)
执行此操作的一种方法是将init()
设为final并将其操作委托给第二个可覆盖的方法:
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()
时,序言和结尾都会自动执行,派生类不必做任何事情。
答案 1 :(得分:4)
另一种想法是在一个方面编织。在建议切入点之前和之后添加。
答案 2 :(得分: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.
}
}
答案 3 :(得分:0)
其他答案是合理的解决方法,但可以解决一个确切的问题:不,没有办法自动执行此操作。您必须明确呼叫triggerBody()?['Body']
。