繁体   English   中英

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

[英]How do I make sure a super method is called in a child?

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

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

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

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
    }

}

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

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

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

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

abstract class MyClass 
{

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

protected abstract doSend(); // no external calls

}

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

abstract class Parent {

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

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

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

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
    }
}

没有关键字强制执行此操作。 在我看来,你也是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM