7

假设我有这两个类,一个扩展另一个

public class Bar{

    public void foo(){

    }

}

public class FooBar extends Bar {

    @Override
    public void foo(){
        super.foo(); //<-- Line in question
    }

}

我想要做的是警告用户foo如果他们没有在覆盖方法中调用超类的方法,这可能吗?

或者有没有办法知道,如果我将类类型传递给超类,则使用反射来覆盖其超类的方法的方法调用原始方法?

例如:

public abstract class Bar{

    public Bar(Class<? extends Bar> cls){
        Object instance = getInstance();
        if (!instance.getClass().equals(cls)) {
            throw new EntityException("The instance given does not match the class given.");
    }
        //Find the method here if it has been overriden then throw an exception
        //If the super method isn't being called in that method
    }

    public abstract Object getInstance();

    public void foo(){

    }

}

public class FooBar extends Bar {

    public FooBar(){
        super(FooBar.class);
    }

    @Override
    public Object getInstance(){
        return this;
    }

    @Override
    public void foo(){
        super.foo();
    }

}

甚至我可以在超级方法上添加一个注释,以便表明它需要被调用?


编辑

注意,需要调用 foo 方法的不是超类,而是调用子类的 foo 方法的人,例如数据库close方法

如果归根结底,我什至会很高兴使该方法“不可覆盖”,但仍想给它一个自定义消息。


编辑 2

这在某种程度上是我想要的:

在此处输入图像描述

但是拥有上述内容仍然会很好,或者甚至给他们一个自定义消息来做其他事情,比如,Cannot override the final method from Bar, please call it from your implementation of the method instead

4

2 回答 2

4

编辑:回答已编辑的问题,其中包括:

我什至会很高兴使该方法“不可覆盖”

...只需制作方法final。这将防止子类覆盖它。从JLS 的第 8.4.3.3 节

可以声明一个方法final以防止子类覆盖或隐藏它。

尝试覆盖或隐藏final方法是编译时错误。

要回答原始问题,请考虑改用模板方法模式

public abstract class Bar {
    public foo() {
        // Do unconditional things...
        ...
        // Now subclass-specific things
        fooImpl();
    }

    protected void fooImpl();
}

public class FooBar extends Bar {
    @Override protected void fooImpl() {
        // ...
    }
} 

当然,这不会强制 的子类FooBar覆盖fooImpl和调用super.fooImpl()- 但FooBar 可以通过再次应用相同的模式来做到这一点 - 使其自己的fooImpl实现最终化,并引入新的受保护抽象方法。

于 2013-10-12T05:47:22.957 回答
0

你可以做的是如下

public class Bar{

    public final void foo(){
        //do mandatory stuff
        customizeFoo();
    }

    public void customizeFoo(){

    }

}

public class FooBar extends Bar {

    @Override
    public void customizeFoo(){
        //do custom suff
    }

}

foo 方法在超类中设置为“最终”,以便子类无法覆盖并避免执行强制操作

于 2013-10-12T05:48:11.497 回答