2012-08-13 49 views
1

我有以下想做深層複製的類。包含界面的深度複製對象

public class KeyInfo 
{ 
    public KeyInfo(IKeySetup keySetup, IKeyData data) 
    { 
    KeySetup = keySetup; 
    Data = data; 
    } 

    public IKeySetup KeySetup { get; set; } 
    public IKeyData Data { get; set; } 

    public KeyInfo DeepCopy() 
    { 
    var keyInfo = (KeyInfo) this.MemberwiseClone(); 
    return keyInfo; 
    } 
} 

如何複製接口?我是否必須爲接口實現ICloneable,然後讓每個接口中的一個實現Clone()?有沒有辦法避免每個班級必須實施這樣的功能?

+0

我想你的接口想暴露一個'DeepCopy'方法(而不是使用ICloneable,因爲它不會推斷它是淺層還是深層拷貝,也不是類型安全的)。你的'KeyInfo'類如何深度複製'SomeOtherCrazyIKeySetupImplementation'?您可以序列化/反序列化副本,但這取決於您的設計和實現。 – 2012-08-13 21:07:28

+0

@ChrisSinclair Plus,它將取決於接口是否可以連續化!遞歸屬性或無限循環屬性會在序列化練習中產生一個凹痕= D – Tejs 2012-08-13 21:09:50

+0

至於OP,聽起來您可能想要實現實現接口的結構。這樣,作爲值類型,它們可以被簡單地複製。不知道如果有幫助。 – Tejs 2012-08-13 21:10:44

回答

1

由於沒有建立對象的深層副本的內置方法,因此您必須提供自己的副本才能這樣做。

強制執行者IKeySetup/IKeyData將DeepCopy包含在界面中可能是個好主意。要求ICloneable可能是另一種方法 - 編譯時間(通過從ICloneable推導出您的IKeySetup/IKeyData),或者如果對象不支持ICloneable,則通過顯示來運行。

+4

只需要添加一下,如果你打算讓接口實現一種克隆方法,就可以拋棄ICloneable,並用一個DeepClone方法實現你自己的IDeepCloneable接口,這個方法明確地表明你期待的開發者一個完整的深度克隆。 – 2012-08-13 21:13:52

0

您可以使用Fasterflect方法通過發射來複制對象。