Di C #, apa cara yang disukai untuk menambahkan fungsionalitas salin (dalam) ke kelas? Haruskah seseorang menerapkan konstruktor salinan, atau lebih tepatnya berasal dari ICloneable dan mengimplementasikan metode Clone ()?
Masalahnya ICloneableadalah, seperti yang telah disebutkan orang lain, bahwa itu tidak menentukan apakah itu salinan yang dalam atau dangkal, yang membuatnya praktis tidak dapat digunakan dan, dalam praktiknya, jarang digunakan. Ini juga kembali object, yang merepotkan, karena membutuhkan banyak casting. (Dan meskipun Anda secara khusus menyebutkan kelas dalam pertanyaan tersebut, menerapkan ICloneablepada structtinju memerlukan.)
Copy constuctor juga mengalami salah satu masalah dengan ICloneable. Tidak jelas apakah konstruktor salinan melakukan salinan dalam atau dangkal.
Account clonedAccount = new Account(currentAccount); // Deep or shallow?
Akan lebih baik untuk membuat metode DeepClone (). Dengan cara ini maksudnya sangat jelas.
Ini menimbulkan pertanyaan apakah itu harus menjadi metode statis atau contoh.
Account clonedAccount = currentAccount.DeepClone(); // instance method
atau
Account clonedAccount = Account.DeepClone(currentAccount); // static method
Kadang-kadang saya lebih suka versi statis, hanya karena kloning tampak seperti sesuatu yang dilakukan pada suatu objek daripada sesuatu yang dilakukan objek. Dalam kedua kasus tersebut, akan ada masalah yang harus ditangani saat mengkloning objek yang merupakan bagian dari hierarki pewarisan, dan bagaimana masalah tersebut dihapus pada akhirnya dapat mendorong desain.
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();
}
}