[英]java: inheritance questions about overriding methods
如果父類中的方法不需要參數,但是子類中的重寫方法則需要一個參數。 在父類的方法中有一個no use參數是一種好習慣嗎?
//in parent class:
getFeature(String name){
return defaultFeature;
}
//in child class:
getFeature(String name){
return new Feature(name);
}
此方法僅在父類的另一個方法中使用。 因此,對於父類和子類,我們具有相同的簽名。 真正的問題是兩個子類的getFeature實現略有不同。
還是有更好的方法來做到這一點?
實際上,您重寫了它,這是一種誤導性的方法,因為類的客戶端將必須傳遞一個String
而該String
僅在子類中使用:
child.getFeature("makeSenseArg");
parent.getFeature("notUsedArg");
您應該在子類中重載getFeature()
方法:
//in parent class:
getFeature(){
return defaultFeature;
}
//in child class:
getFeature(String name){
return new Feature(name);
}
您不會再受益於多態性,但是這可能不是問題,因為這是兩種截然不同的行為。
將它們合並為一個方法簽名可能不是最好的選擇。
請注意,如果您確實需要依賴覆蓋,則可以使用@javax.annotation.Nullable
注釋參數。
它使類客戶端的API更清晰,此外,諸如Sonar之類的代碼分析工具也將這些注釋考慮在內。
這將給:
// parent class
Feature getFeature(@Nullable String name){
return defaultFeature;
}
此外,如果對於重寫方法,該參數是必需的,則您甚至可以指定“反向”注釋( @javax.validation.constraints.NotNulll
):
//child class
Feature getFeature(@NotNulll String name){
return new Feature(name);
}
客戶會打電話給他們:
child.getFeature("makeSenseArg");
parent.getFeature(null);
在父類的方法中有一個no use參數是一種好習慣嗎?
這取決於。 如果API設計預期即使基類不需要子類,子類也將需要參數, 並且您想確保可以通過父類型引用來調用該方法的參數版本:
Parent instance = new Subclass();
Feature f = instance.getFeature("foo");
...然后,即使您沒有在實現中使用它,也必須在父類簽名中包含該參數。 您可能還具有無參數版本,該版本始終提供無參數功能:
class Parent {
public Feature getFeature() { // Maybe you'd want this, maybe not
return defaultFeature;
}
public Feature getFeature(String name) {
return this.getFeature();
}
}
class Subclass extends Parent {
@Override
public Feature getFeature(String name) {
return /*...*/;
}
}
但是,如果您預計子類實例將僅與子類類型的引用一起使用:
Subclass instance = new Subclass();
// ^^---------- note
Feature f = instance.getFeature("foo");
...然后沒有理由讓父類的getFeature
擁有它。 子類可以將其添加為重載:
class Parent {
public Feature getFeature() {
return defaultFeature;
}
}
class Subclass extends Parent {
public Feature getFeature(String name) {
return /*...*/;
}
}
這僅意味着Parent
類型的引用將限於getFeature
的無參數功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.