如何强制派生类在多层上调用超类方法?

Ban*_*Pig 9 java design-patterns

我正在尝试找到一种最优雅的方式来允许孩子和父母对祖父母发起的事件做出反应。这是一个天真的解决方案:

abstract class A {
    final public void foo() {
        // Some stuff here
        onFoo();
    }

    protected abstract void onFoo();
}

abstract class B extends A {
    @Override
    final protected void onFoo() {
        // More stuff here
        onOnFoo();
    }

    protected abstract void onOnFoo();
}

class C extends B {
    @Override
    protected void onOnFoo() {
        // Even more stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,基本上,我正在尝试找到一种最佳方法,以便在调用foo()时允许所有相关类执行某些逻辑。为了稳定和简单起见,我希望所有步骤都按顺序完成,尽管这不是必需的。

我发现的另一种解决方案涉及将所有事件处理程序存储为某种形式的Runnable:

abstract class A {
    private ArrayList<Runnable> fooHandlers = new ArrayList<>();

    final public void foo() {
        // Some stuff here
        for(Runnable handler : fooHandlers) handler.run();
    }

    final protected void addFooHandler(Runnable handler) {
        fooHandlers.add(handler);
    }
}

abstract class B extends A {
    public B() {
        addFooHandler(this::onFoo);
    }

    private void onFoo() {
        // Stuff
    }
}

class C extends B {
    public C() {
        addFooHandler(this::onFoo);
    }

    private void onFoo() {
        // More stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法肯定比第一种更好。但是,我仍然好奇是否有更好的选择。

Don*_*nat 0

那通过调用super方法呢?

class A {
  void foo() {
    System.out.println("Some stuff here");
  }
}

class B extends A {
  @Override
  void foo() {
    super.foo();
    System.out.println("More stuff here");
  }
}

class C extends B {
  @Override
  void foo() {
    super.foo();
    System.out.println("Even more stuff here");
  }
}
Run Code Online (Sandbox Code Playgroud)