3 回答

TA貢獻(xiàn)1831條經(jīng)驗 獲得超9個贊
在C#中,向類添加(深度)復(fù)制功能的首選方法是什么?是應(yīng)該實現(xiàn)復(fù)制構(gòu)造函數(shù),還是應(yīng)該從ICloneable派生并實現(xiàn)Clone()方法?
ICloneable正如其他人提到的那樣,它的問題在于它沒有指定是深拷貝還是淺拷貝,這使得它實際上不可用,并且在實踐中很少使用。它也返回object,這很痛苦,因為它需要大量的轉(zhuǎn)換。(盡管您在問題中特別提到了類,但I(xiàn)Cloneable在structrequire box上實現(xiàn)。)
復(fù)制構(gòu)造者也遭受ICloneable的問題之一。復(fù)制構(gòu)造函數(shù)是在進(jìn)行深層復(fù)制還是淺層復(fù)制,這一點并不明顯。
Account clonedAccount = new Account(currentAccount); // Deep or shallow?
最好創(chuàng)建一個DeepClone()方法。這樣,意圖就很清楚了。
這就提出了一個問題,它應(yīng)該是靜態(tài)方法還是實例方法。
Account clonedAccount = currentAccount.DeepClone(); // instance method
要么
Account clonedAccount = Account.DeepClone(currentAccount); // static method
有時候,我稍微偏愛靜態(tài)版本,因為克隆似乎是對對象執(zhí)行的操作,而不是對象正在執(zhí)行的操作。無論哪種情況,在克隆屬于繼承層次結(jié)構(gòu)的對象時都將要處理一些問題,而如何解決這些問題最終可能會推動設(shè)計。
class CheckingAccount : Account
{
CheckAuthorizationScheme checkAuthorizationScheme;
public override Account DeepClone()
{
CheckingAccount clone = new CheckingAccount();
DeepCloneFields(clone);
return clone;
}
protected override void DeepCloneFields(Account clone)
{
base.DeepCloneFields(clone);
((CheckingAccount)clone).checkAuthorizationScheme = this.checkAuthorizationScheme.DeepClone();
}
}
- 3 回答
- 0 關(guān)注
- 507 瀏覽
添加回答
舉報