簡體   English   中英

我為什么要在c#中實現ICloneable?

[英]Why should I implement ICloneable in c#?

你能解釋一下為什么我應該從ICloneable繼承並實現Clone()方法嗎?

如果我想做一個深層復制,我不能只實現我的方法嗎? 我們說MyClone()

我為什么要繼承ICloneable 有什么好處? 這只是讓代碼“更具可讀性”的問題嗎?

你不應該。 Microsoft建議不要實現ICloneable因為接口沒有明確指示您的Clone方法是執行“深度”還是“淺層”克隆。

有關詳細信息,請參閱2003年布拉德艾布拉姆斯的這篇博文 (!)。

isn't very useful, which is to say that there really aren't many situations where it's useful to know that an object is cloneable without knowing anything else about it. ICloneable接口並不是很有用,也就是說,實際上並沒有很多情況下知道對象是可克隆的而不知道其它任何東西是有用的。 這是一種非常不同的情況,例如IEnumerableIDisposable ; 在許多情況下接受IEnumerable而不知道除了如何枚舉之外的其他任何東西都很有用。

另一方面, ICloneable在作為通用約束與其他約束一起應用時可能是有用的。 例如,基類可能有用地支持許多衍生物,其中一些可以被有效地克隆,而其中一些則不能。 如果基類型本身暴露了公共克隆接口,那么任何無法克隆的衍生類型都會違反Liskov替換原則。 避免此問題的方法是使用Protected方法使基類型支持克隆,並允許派生類型在他們認為合適時實現公共克隆接口。

一旦完成,一個想要接受WonderfulBase類型的對象並且需要能夠克隆它的方法可以被編碼為接受支持克隆的WonderfulBase對象(使用具有基類型和ICloneable的泛型類型參數)約束)。 盡管ICloneable接口本身並不表示深度或淺層克隆,但WonderfulBase的文檔將指示是否應該對可克隆的WonderfulBase進行深度克隆或淺層克隆。 從本質上講, ICloneable接口不會完成通過定義ICloneableWonderfulBase無法完成的任何事情,除了它將避免必須為每個不同的可克隆基類定義不同的名稱。

ICloneable是BCL中那些備受爭議的文物之一。 恕我直言,沒有真正的理由來實施它。 話雖如此,如果我要創建一個克隆方法然后我實現ICloneable ,我提供自己的強類型Clone

ICloneable的問題在於,如果Clone是一個淺層或深層副本,它是非常不同的東西。 事實上,沒有ICloneable<T>可能表明微軟對ICloneable的看法

馬特是對的,不要用它。 創建自己的Copy()方法(或類似名稱),並在公共API中清楚地表明您的方法是創建對象的深層還是淺層副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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