2010-09-27 73 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

相關問題