2010-09-27 83 views
1

说我有声明如下类别:如何调用基类方法?

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

向父方法添加显式调用。例如validate(){return super.validate(); } – Andreas 2010-09-27 13:28:27

+0

你如何测试它,因为基类和子类'validate()'方法返回'true'。 – 2010-09-27 13:29:35

+0

你能解释一下它的用例吗? – 2010-09-27 13:45:08

回答

9

你不能。你最好的办法是在PreferenceCategory中增加另一种方法,这个方法叫超级的validate()方法。

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

但是,您为什么要这么做?这是一种设计气味。你可能会发现chain of responsibilty pattern有趣。

+0

谢谢,这不是我的设计,我只是编码:)。 – dcp 2010-09-27 13:32:13

+0

不客气。我看,祝你好运与编码:) – BalusC 2010-09-27 13:34:20

+1

然后质疑设计的质量 - 即告诉设计师,他吸!) – Bozho 2010-09-27 13:34:27

0

可以,但只能在子类:

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

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

0

如果您投了,它仍将使用覆盖方法。所以,你应该做这样的事情......

public class PreferenceCategory extends IdentifiableEntity { 
    public boolean validate() { 
     return true; 
    } 
    public boolean validateSuper(){ 
     return super.validate(); 
    } 
} 

然后调用validatesSuper,它应该工作,机器人还远远没有良好的面向对象编程,我真的不建议大家这样做; 如果需要调用不同的验证,所以你应该只给一个不同的名称为方法,并调用它,当你需要,或致电验证调用父类方法现在,没有overrided,像这样...

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

你仍然可以调用超类的validade

相关问题