确保方法执行,即使重写

Mig*_*ork 1 java oop class hierarchy

假设我有一些方法的接口,如下所示:

interface Task {
    void before();
    void doStuff();
    void after();
}
Run Code Online (Sandbox Code Playgroud)

在这里,我将实现其中的一部分:

abstract class PoliteTask implements Task{

    @Override
    public void before() {
        System.out.println("Hey");
    }


    @Override
    public abstract void doStuff();


    @Override
    public void after() {
        System.out.println("Cya");
    }

}
Run Code Online (Sandbox Code Playgroud)

现在我想确保在所有扩展类中调用这些before()after()实现.

这里我们有一个需要初始化的类before():

class ActualStuffTask extends PoliteTask {

    private int fancyNumber;


    @Override
    public void before() {
        // init some things
        fancyNumber = 42;
    }


    @Override
    public void doStuff() {
        System.out.println("Look, a number: "+fancyNumber);
    }

}
Run Code Online (Sandbox Code Playgroud)

显然,ActualStuffTask覆盖before(),因此它不会说"嘿",只有"Cya".

如果我使用了这些方法PoliteTask final,那么这不会发生,但是它的子类无法覆盖这些方法.

调用super.before()ActualStuffTask会的工作,但我想有这种效果保证,不管子类实现的.

问题是:

我应该使用什么模式来同时实现父实现和子实现?

Sot*_*lis 5

我喜欢使用您在实现类中实现的抽象方法.

abstract class PoliteTask implements Task{

    @Override
    public final void before() {
        System.out.println("Hey");
        doBefore();
    }

    protected abstract void doBefore();
    protected abstract void doAfter();

    @Override
    public abstract void doStuff();


    @Override
    public final void after() {
        System.out.println("Cya");
        doAfter();
    }

}

class ActualStuffTask extends PoliteTask {
    private int fancyNumber;

    @Override
    protected void doBefore() {
        // init some things
        fancyNumber = 42;
    }


    @Override
    public void doStuff() {
        System.out.println("Look, a number: "+fancyNumber);
    }


    @Override
    protected void doAfter() {
        // something else
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Task方法是final.他们不需要.这取决于您构建API的方式.