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