想象一下,您有一個派生類,其中基類是不能修改的。基類有許多狀態(許多非常量私有成員)和許多構造函數,它們具有不同數量的參數來初始化狀態的某個子集(當然,子集的大小因構造函數而異)。在派生類構造函數(或工廠)中初始化基類的模式
現在我的派生類是一個非常輕量級的基類包裝。假設它沒有添加自己的狀態,只是稍微修改了幾個方法的行爲(可能會在調用super.originalMethod()
時做一些額外的日誌記錄)。
我遇到的問題是我想獲取基類的一個對象,並使用相同的狀態創建它的「副本」,但是作爲我的派生類的實例。
這證明很困難。我不能調用基類的「最完整」構造函數,通過調用getters來傳遞源代碼中的所有狀態,因爲根據基類的構造方式,某些狀態值可能會被此構造方法拒絕。例如,您可以使用0-arg ctor創建一個默認對象,任何許多值都將爲null。但是,在ctor中傳遞空值以允許您指定這些值並不合法。
此外,上述方法是脆弱的,因爲如果對基類進行修改會增加更多的狀態,並且「更完整」的構造函數(或者不能在構造函數中設置的狀態,但只能通過訪問方法)被添加後,副本將不會再完成。
我想要的就像`clone(),而是初始化相同類型的新對象,初始化派生類的基類成員。我猜這樣的事情不存在。任何可能提供相同內容的模式建議?
請記住,我不能修改基類。如果可以的話,這會容易得多。
的確如此。缺點是類D在這種情況下有無用的(總是空/默認)成員。雖然很有意思,但它並沒有實現hoipolloi答案的接口問題。 – BeeOnRope
我喜歡用單個句子描述看似複雜的問題的解決方案。 – gdbj