对非构造函数方法强制执行超级调用

Tor*_*tel 2 java inheritance superclass

是否可以强制重写方法来调用超类方法?构造函数总是需要调用它们的超类构造函数.但是我希望在普通方法上强制执行此操作,而不是在它被称为问题时的位置.

例:

public class A {

    public void doSth() {
        System.out.println("I must appear on console!");
    }

}

public class B extends A {

    @Override
    public void doSth() {
        System.out.println("Bla!");  // IDE should mark an error, because supermethod is not called.
    }

}
Run Code Online (Sandbox Code Playgroud)

And*_*eas 9

不,那是不可能的.完全取决于调用超类方法的重写方法.

但是,如果要强制执行控制,有一种方法可以执行此操作.

这称为模板方法模式.模板方法是抽象的还是存根(如此处所示)取决于它们是否必须执行某些操作,或者只是允许执行额外的操作.

public class A {
    public final void doSth() { // final, preventing override by subclasses
        beforeDoSth();
        System.out.println("I must appear on console!");
        afterDoSth();
    }
    protected void beforeDoSth() { // protected, since it should never be called directly
        // Stub method, to be overridden by subclasses, if needed
    }
    protected void afterDoSth() {
        // Stub method, to be overridden by subclasses, if needed
    }
}

public class B extends A {
    @Override
    protected void afterDoSth() {
        System.out.println("Bla!");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你再执行new B().doSth(),你会得到:

I must appear on console!
Bla!
Run Code Online (Sandbox Code Playgroud)