簡體   English   中英

繼承 - 重寫mutator方法?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM