簡體   English   中英

如何調用基類方法?

[英]How to call base class method?

說我有這樣聲明的類:

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

有什么辦法嗎?

你不能 最好的選擇是向PreferenceCategory添加另一個方法,該方法調用super的validate()方法。

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

但是,為什么要這樣做呢? 這有點設計味。 您可能會發現責任模式鏈很有趣。

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

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

如果您不想覆蓋,為什么不以不同的方式命名方法? 如果調用者必須能夠選擇他們調用的方法,則這些方法將執行不同的操作,這應反映在方法名稱中。

如果進行強制轉換,它將仍然使用override方法。 所以你應該做類似的事情...

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;
    }
}

您仍然可以從超類調用validateade

在Java中,除了從具有super.methodName()的子類中進行操作外,沒有其他方法可以做到這一點。 甚至沒有反射。 諸如Ruby之類的其他語言也可以通過反射來實現。

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM