[英]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.