[英]Inheritance - overriding mutator methods?
所以,假设我有以下课程:
abstract class Foo{
.
.
.
public void setKey(FooKey key){
this.key = key;
}
}
final class Bar extends Foo{
.
.
.
@Override
public void setKey(BarKey key){ // Can't do this?
super.setKey(key);
}
}
在上述例子中, BarKey
是的一个子类FooKey
。 在这里,我想确保为Bar
设置的键是FooKey
的特定子类(即BarKey
)。 我该怎么做? 我是否过于复杂? 有更好的设计方法吗?
这是不正确的,因为你使子类比超类更具限制性:超类可以设置任何类型的FooKey,但子类只接受BarKey。
为此,您需要使超类具有通用性:
abstract class Foo<K extends FooKey> {
private K key;
public void setKey(K key){
this.key = key;
}
}
final class Bar extends Foo<BarKey> {
}
你不能这样强制执行。 考虑:
Bar b = new Bar();
FooKey k = new FooKey();
b.setKey(k); // You want to prohibit this
Foo f = b;
f.setKey(k); // But there's no way to prohibit this
通常,派生类不能提供比其超类更严格的接口。
所以我建议从抽象类中删除setKey
。
您应该阅读覆盖和重载之间的区别。 你所做的只是简单重载,因为你改变了覆盖不允许的参数类型。
简单地删除@Override
注释,因为你没有覆盖超类的方法(应该是相同的参数),你只是定义一个具有更窄类型的新setKey
方法。 但是,这个新的setKey方法只能通过Bar
引用访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.