Вызов метода суперкласса автоматически
Рассмотрим следующий класс
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() дочернего класса заканчивается.
Один из основных способов сделать это - снова добавить вызов метода atEnd() в конце метода init() дочерних классов. Но есть ли другой способ сделать это с умом?
Ответы
Ответ 1
Один из способов сделать это - сделать init()
final и делегировать его операцию второму, overridable, method:
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()
, пролог и эпилог выполняются автоматически, а производным классам ничего не нужно делать.
Ответ 2
Другая мысль заключалась бы в том, чтобы сплести в одном аспекте. Добавьте до и после указания pointcut.
Ответ 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.
}
}