問題最明顯的情況是功能克隆(只是示例傢伙)。假設您有BaseClass和DerivedClass - 除非我錯過了兩個函數(分別爲每個類的克隆)分別創建BaseClass和DerivedClass,但實際返回對象。 這是如果你想與「真正的」類工作的問題。如何處理不同類型結果的覆蓋函數?
到目前爲止,我看到的只有兩種方法可以解決這個問題:
每次施放函數的結果適當類
var real_stuff = (RealStuff)x.Clone(); // I want real stuff
2.提供第二個功能,所以您將擁有克隆(如果您在基礎級別工作)和CloneThis(如果您希望在給定的職業級別工作,結果將從班級變爲班級)
public override object Clone()
{
return CloneThis();
}
public RealStuff CloneThis()
{
return new RealStuff(this);
}
第一個是醜陋的,第二個是令人厭煩的。
問題:你如何處理這個問題?
另一件事 - 請評論這一點以及如果你喜歡 - 是爲什麼當重寫函數簽名檢查是如此嚴格?除了「因爲它是按照這種方式設計的」,還是Eric Lippert最喜歡的「因爲每個功能都需要...」;-)我沒有看到允許覆蓋功能改變的結果類型的技術問題(以及邏輯等)IF重寫函數結果是從原始函數結果類型派生的。
例子:
class ClassA
{
public virtual ClassA GetIt() ...
}
class ClassB : ClassA
{
public override ClassB GetIt() ...
}
目前,它是不正確的代碼,但我認爲這在技術上可能是,因爲ClassB的是從ClassA的派生。無論你如何處理輸出,「接收器」都需要ClassA,所以ClassB滿足了這個要求。
所以,你可以寫:
ClassA class_a_b = new ClassB();
ClassB class_b_b = new ClassB();
ClassA result1 = class_b_b.GetIt();
ClassA result2 = class_a_b.GetIt();
ClassB result3 = class_b_b.GetIt();
// incorrect, derived GetIt would be called OK,
// but the signature is taken from ClassA
ClassB result4 = class_a_b.GetIt();
我也並不認爲有這種能力的人會被行爲感到驚訝,恕我直言這是一致的。
請保留您的答案on-topic,「您不應該使用ICloneable」是不是的主題。謝謝。
您是否考慮過公開虛擬T Clone方法,該方法可以被覆蓋並在沒有推斷出的類型時被調用克隆(myObj)? –
Mart
2011-05-26 07:13:43
可能的重複http://stackoverflow.com/questions/536349/why-no-icloneablet和http://stackoverflow.com/questions/1048884/c-overriding-return-types – 2011-05-26 07:16:54
@Paolo Tedesco,第二個是好的謝謝你。這個問題是** DUPLICATE **,我該如何關閉它? – greenoldman 2011-05-26 07:29:07