java:关于重写方法的继承问题

时间:2018-02-08 15:59:09

标签: java class inheritance override

如果父类中的方法不需要参数,但子类中的重写方法需要一个参数。在父类的方法中使用无用参数是一种好习惯吗?

//in parent class:
getFeature(String name){
    return defaultFeature;
}

//in child class:
getFeature(String name){
    return new Feature(name);
}

此方法仅在父类中的另一个方法中使用。所以我们对父类和子类有相同的签名。真正的问题有两个子类,其中getFeature的实现稍有不同。

或者有更好的方法来实现这一目标吗?

2 个答案:

答案 0 :(得分:2)

实际覆盖,这是一种误导性的方法,因为类的客户端必须传递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);

答案 1 :(得分:2)

  

在父类的方法中使用无用参数是不错的做法?

这取决于。如果API设计预期子类将需要参数,即使基类没有,,您希望确保可以通过父类型引用调用方法的参数版本: / p>

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的无参数功能。