假设我有这两个类,一个扩展另一个
public class Bar{
public void foo(){
}
}
public class FooBar extends Bar {
@Override
public void foo(){
super.foo(); //<-- Line in question
}
}
我想要做的是警告用户调用超类的方法foo
如果他们没有使用覆盖方法,这可能吗?
或者有没有办法知道,使用反射,如果我将类类型传递给super,那么覆盖其超类方法的方法会调用原始方法?
例如:
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();
}
}
甚至可以在super方法上添加一个注释,因此它表明需要调用它?
修改
注意,它不是需要调用foo方法的超类,而是调用子类的foo方法的人,例如数据库close
方法
我甚至会很高兴让这个方法“不可覆盖”,如果归结为它,但仍然希望给它一个自定义消息。
修改2
这就是我想要的方式:
但是拥有上述内容仍然很好,甚至可以给他们一个自定义消息来做其他事情,例如Cannot override the final method from Bar, please call it from your implementation of the method instead
答案 0 :(得分:4)
编辑:回答编辑过的问题,其中包括:
我甚至会对使该方法“不可覆盖”
感到高兴
...只需制作方法final
。这将阻止子类覆盖它。来自section 8.4.3.3 of the JLS:
可以声明一个方法
final
,以防止子类覆盖或隐藏它。尝试覆盖或隐藏
final
方法是编译时错误。
要回答原始问题,请考虑改为使用template method pattern:
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
实现最终,并引入一个新的受保护的抽象方法。
答案 1 :(得分: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方法在超类中使'final'成为子类不能覆盖并避免强制执行的东西