Trong C #, cách ưa thích để thêm chức năng sao chép (sâu) vào một lớp là gì? Có nên thực hiện hàm tạo sao chép, hay xuất phát từ IClonizable và thực hiện phương thức Clone ()?
Vấn đề với ICloneable
, như những người khác đã đề cập, nó không chỉ rõ đó là bản sao sâu hay nông, khiến nó thực tế không thể sử dụng được và trong thực tế, hiếm khi được sử dụng. Nó cũng trở lại object
, đó là một nỗi đau, vì nó đòi hỏi rất nhiều vai. (Và mặc dù bạn đã đề cập cụ thể đến các lớp trong câu hỏi, việc thực hiện ICloneable
một struct
môn quyền anh đòi hỏi.)
Một người lập bản sao cũng bị một trong những vấn đề với IClonizable. Không rõ liệu một nhà xây dựng bản sao đang làm một bản sao sâu hay nông.
Account clonedAccount = new Account(currentAccount); // Deep or shallow?
Tốt nhất nên tạo phương thức DeepClone (). Bằng cách này, ý định là hoàn toàn rõ ràng.
Điều này đặt ra câu hỏi liệu nó nên là một phương thức tĩnh hay cá thể.
Account clonedAccount = currentAccount.DeepClone(); // instance method
hoặc là
Account clonedAccount = Account.DeepClone(currentAccount); // static method
Đôi khi tôi hơi thích phiên bản tĩnh, chỉ vì nhân bản có vẻ như là một cái gì đó đang được thực hiện cho một đối tượng hơn là một cái gì đó mà đối tượng đang làm. Trong cả hai trường hợp, sẽ có những vấn đề cần giải quyết khi nhân bản các đối tượng là một phần của hệ thống phân cấp kế thừa và làm thế nào những vấn đề đó được đưa ra cuối cùng có thể thúc đẩy thiết kế.
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();
}
}