簡體   English   中英

java:關於重寫方法的繼承問題

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

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