如果父类中的方法不需要参数,但子类中的重写方法需要一个参数。在父类的方法中使用无用参数是一种好习惯吗?
//in parent class:
getFeature(String name){
return defaultFeature;
}
//in child class:
getFeature(String name){
return new Feature(name);
}
此方法仅在父类中的另一个方法中使用。所以我们对父类和子类有相同的签名。真正的问题有两个子类,其中getFeature的实现稍有不同。
或者有更好的方法来实现这一目标吗?
答案 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
的无参数功能。