Java 如何调用基类方法?

Java 如何调用基类方法?,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,假设我有这样声明的类: public abstract class IdentifiableEntity { public boolean validate() { return true; } } public class PreferenceCategory extends IdentifiableEntity { public boolean validate() { return true; } } 现在,假设我创建了

假设我有这样声明的类:

public abstract class IdentifiableEntity  {
    public boolean validate() {
        return true;
    }
}

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validate() {
        return true;
    }
}
现在,假设我创建了PreferenceCategory变量,我想调用IdentifiableEntity.validate方法,而不是PreferenceCategory.validate方法

我本以为我可以通过cast实现这一点,请参见下文,但它仍然调用重写的方法:

PreferenceCategory cat = new PreferenceCategory();

// this calls PreferenceCategory.validate(), not what I want
((IdentifiableEntity)cat).validate(); 

有办法吗?

你不行。您最好的选择是向PreferenceCategory添加另一个方法,该方法调用super的validate方法


但你为什么要这么做?这有点设计的味道。你可能会觉得有趣。

你不能。您最好的选择是向PreferenceCategory添加另一个方法,该方法调用super的validate方法


但你为什么要这么做?这有点设计的味道。您可能会发现有趣的内容。

您可以,但只能在子类中:

public boolean simpleValidate() {
    return super.validate();
}

如果不希望重写,为什么不以不同的方式命名该方法?如果调用者必须能够选择他们调用的方法,那么这些方法会做不同的事情,这应该反映在方法名称中。

您可以,但只能在子类中:

public boolean simpleValidate() {
    return super.validate();
}

如果不希望重写,为什么不以不同的方式命名该方法?如果调用者必须能够选择他们调用的方法,那么这些方法会执行不同的操作,这应该反映在方法名称中。

如果您强制转换,它仍将使用覆盖方法。所以你应该这样做

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validate() {
        return true;
    }
    public boolean validateSuper(){
        return super.validate();
    }
}
然后你调用ValidateSuper,它应该可以工作,bot远远不是好的OO编程,我真的不建议你这么做; 如果您需要调用不同的验证,那么您应该为该方法指定不同的名称,并在需要时调用它,或者现在调用验证来调用超类方法,而不是重写,就像这样

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validatePreferenceCategory() {
        return true;
    }
}

您仍然可以从超类调用validade,如果您强制转换,它仍将使用覆盖方法。所以你应该这样做

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validate() {
        return true;
    }
    public boolean validateSuper(){
        return super.validate();
    }
}
然后你调用ValidateSuper,它应该可以工作,bot远远不是好的OO编程,我真的不建议你这么做; 如果您需要调用不同的验证,那么您应该为该方法指定不同的名称,并在需要时调用它,或者现在调用验证来调用超类方法,而不是重写,就像这样

public class PreferenceCategory extends IdentifiableEntity {
    public boolean validatePreferenceCategory() {
        return true;
    }
}

您仍然可以从超类调用validade,在Java中,除了从super.methodName子类中调用之外,没有其他方法可以这样做。甚至没有反省。其他语言,如Ruby,可以通过反射来实现


在Java中,除了从super.methodName的子类中,没有其他方法可以做到这一点。甚至没有反省。其他语言,如Ruby,可以通过反射来实现


向父方法添加显式调用。e、 验证{return super.validate;}由于base和subclass validate方法都返回true,您如何测试它。您能解释一下它的用例吗?添加对父方法的显式调用。e、 验证{return super.validate;}既然base和subclass validate方法都返回true,你如何测试它。你能解释一下它的用例吗?谢谢,这不是我的设计,我只是在编写代码:。然后质疑设计的质量——比如说,告诉设计师他很烂@Bozho-LOL,可能不是最好的交友方式:。谢谢你的笑声:@dcp,当然,不要直接告诉他。但是讨论一个潜在的变化。谢谢,这不是我的设计,我只是在编码:。然后质疑设计的质量——比如说,告诉设计师他很烂@Bozho-LOL,可能不是最好的交友方式:。谢谢你的笑声:@dcp,当然,不要直接告诉他。但是讨论一个潜在的变化。