如何调用基类方法?

时间:2010-09-27 13:25:54

标签: java inheritance abstract-class

假设我的类声明如下:

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(); 

有什么办法吗?

4 个答案:

答案 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