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