假设我的类声明如下:
public abstract class IdentifiableEntity {
public boolean validate() {
return true;
}
}
public class PreferenceCategory extends IdentifiableEntity {
public boolean validate() {
return true;
}
}
现在,假设我创建了PreferenceCategory变量,我想调用IdentifiableEntity.validate()方法,不 PreferenceCategory.validate()方法。
我原本以为我可以用演员表来做到这一点(见下文),但它仍然会调用被覆盖的方法:
PreferenceCategory cat = new PreferenceCategory();
// this calls PreferenceCategory.validate(), not what I want
((IdentifiableEntity)cat).validate();
有什么办法吗?
答案 0 :(得分:9)
你做不到。您最好的办法是向PreferenceCategory
添加另一种调用超级validate()
方法的方法。
public boolean validateSuper() {
return super.validate();
}
但你为什么要那样做呢?这有点设计气味。您可能会发现chain of responsibilty pattern很有趣。
答案 1 :(得分:0)
你可以,但只能在子类中使用:
public boolean simpleValidate() {
return super.validate();
}
如果您不想覆盖,为什么不以不同方式命名方法?如果调用者必须能够选择他们调用的方法,那么这些方法会做不同的事情,这些事情应该反映在方法名称中。
答案 2 :(得分:0)
如果你施放,它仍然会使用覆盖方法。所以你应该做那样的事......
public class PreferenceCategory extends IdentifiableEntity {
public boolean validate() {
return true;
}
public boolean validateSuper(){
return super.validate();
}
}
然后你调用validatesSuper,它应该工作,bot远非好的OO编程,我真的不建议你这样做; 如果您需要调用另一个验证,那么您应该为该方法指定一个不同的名称并在需要时调用它,或者调用validate来调用现在的超类方法,而不是覆盖,就像这样......
public class PreferenceCategory extends IdentifiableEntity {
public boolean validatePreferenceCategory() {
return true;
}
}
你仍然可以从超类中调用validade
答案 3 :(得分:0)
除了在具有super.methodName()的子类中之外,在Java中无法做到这一点。甚至没有反思。其他语言如Ruby可以通过反射来实现。
http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on