繁体   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