如何确保在孩子中调用超级方法?

时间:2011-05-23 04:02:20

标签: java methods override super

如果我在一个类中有方法public void send() { /* some code */ }并且让这个类的子节点也有一个方法public void send() { /* some code*/ },我该如何确保子节点必须在某个地方调用super.send() send()方法,它试图覆盖?

我想知道这个,因为我已经用API写了,如果你在覆盖它时不调用那个方法的超级,它会抛出一个异常告诉我,我没有调用超级方法。这是硬编码还是可以用Java中的一些关键字来完成?

7 个答案:

答案 0 :(得分:17)

你不能真的,但你可以......

class MySuperClass {
    public final void send() {
        preSend();
        // do the work...
        postSend();
    }

    protected void preSend() {
        // to be overridden in by sub classes
    }

    protected void postSend() {
        // to be overridden in by sub classes
    }

}

答案 1 :(得分:5)

你可以通过添加一个抽象方法来实现这个目的(不要看另一种方法):

abstract class MyClass 
{

public final void send()  // forbid changing this.
{
 // do something
 doSend():
}

protected abstract doSend(); // no external calls

}

答案 2 :(得分:5)

http://en.wikipedia.org/wiki/Call_super

你要做的是反模式;你可以这样做(许多Java核心类都可以),但你不应该 - 除非你有充分的理由。

除此之外,此处提供的所有答案都是正确的。

答案 3 :(得分:3)

从概念上讲,这就像是“委托给孩子”。为实现这一点,父类应该实现调用一个抽象方法的final方法,该方法应该由子进行实现。

abstract class Parent {

    public final void invoke() {
        // pre invoke code
        doInvoke():
        // post invoke code
    }

    protected abstract doInvoke(); // child should implement this
}

答案 4 :(得分:1)

你不能真正强制子类调用基类。您可以做的一件事是将您的发送方法更改为基数(最终)“发送”和“发送核心”(虚拟),这将被子类覆盖。基数“发送”将设置一些标志,表示尚未调用“sendcore”,然后调用“sendcore”。当它返回时,它可以检查子“sendcore”是否已经调用了基类。

答案 5 :(得分:0)

Java中没有任何内容可以强制调用超类方法。一种方法是在超类中使用私有标志和委托方法。像这样:

public class Super {
    private boolean inSend;
    private boolean superCalled;
    public final void send() {
        inSend = true;
        superCalled = false;
        doSend();
        inSend = false;
        if (!superCalled) {
            throw new IllegalStateException("Failed to call super.doSend()");
        }
    }
    protected void doSend() {
        if (!inSend) {
            throw new IllegalStateException("Cannot call doSend() directly");
        }
        superCalled = true;
        // base class functionality
    }
}

答案 6 :(得分:0)

没有强制执行此操作的关键字。在我看来,你要么

  1. 为子类提供完全覆盖和更改send调用本身所需的所有信息(通过受保护的方法或不需要的方法),或者......
  2. 记录API,以便知道他们最终必须通过send自行调用super。我想大多数超越超类方法的人如果有足够的类被抽象的话就会这样做。