Вопрос по inheritance, java – Вызовите метод суперкласса автоматически

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, которые уже разработаны. Все они расширяют класс А. Если я хочу добавить новую функциональность во все из них, лучше всего это определить в методе класса А. Но условие состоит в том, что метод всегда должен вызываться автоматически перед Метод init () дочернего класса заканчивается. Один из основных способов сделать это - снова добавить вызов метода atEnd () в конце метода init () дочерних классов. Но есть ли другой способ сделать это умно?

Ваш Ответ

4   ответа
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.
    }
}
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()пролог и эпилог выполняются автоматически, и производные классы не должны ничего делать.

0

Другие ответы - разумные обходные пути, но для точного решения вопроса: нет, автоматически сделать это невозможно. Вы должны явно позвонитьsuper.method().

4

Еще одна мысль будет плести в аспекте. Добавьте до и после совета к pointcut.

Если речь идет о защите инвариантов класса, AOP будет очень плохим решением.
Это о "делать вещи"; инварианты не упоминаются. И я не уверен, что "очень плохой" уместно, на основании предоставленной информации.

Похожие вопросы