Ưu và khuyết điểm của sao chép một đối tượng đối tượng với hàm tạo hoặc hàm mẫu là gì?Cách chính xác để nhân đôi đối tượng Delphi
Ví dụ A:
type
TMyObject = class
strict private
FField: integer;
public
constructor Create(srcObj: TMyObject); overload;
//alternatively:
//constructor CreateFrom(srcObj: TMyObject);
property Field: integer read FField;
end;
constructor TMyObject.Create(srcObj: TMyObject);
begin
inherited Create;
FField := srcObj.Field;
end;
Ví dụ B:
type
TMyObject = class
strict private
FField: integer;
public
function Clone: TMyObject;
property Field: integer read FField;
end;
function TMyObject.Clone: TMyObject;
begin
Result := TMyObject.Create;
Result.FField := FField;
end;
Một khác biệt lớn ngay lập tức lò xo để tâm trí - trong trường hợp này các nhà xây dựng Tạo sẽ phải ảo để một hệ thống phân cấp lớp hỗ trợ Bản sao có thể được xây dựng dựa trên TMyObject.
Giả sử đây không phải là vấn đề - TMyObject và mọi thứ dựa trên nó hoàn toàn nằm trong tầm kiểm soát của tôi. Cách ưa thích của bạn làm bản sao constructor trong Delphi là gì? Phiên bản nào bạn thấy dễ đọc hơn? Khi nào bạn sử dụng phương pháp tiếp cận cũ hoặc sau? Bàn luận. :)
EDIT: mối quan tâm chính của tôi với ví dụ đầu tiên là việc sử dụng là rất nặng so với phương pháp thứ hai, tức là
newObj := TMyObject.Create(oldObj)
vs
newObj := oldObj.Clone;
EDIT2 hoặc "Tại sao Tôi muốn hoạt động một dòng "
Tôi đồng ý rằng Chỉ định là phương pháp hợp lý trong hầu hết các trường hợp. Nó thậm chí còn hợp lý để thực hiện 'copy constructor' nội bộ đơn giản bằng cách sử dụng gán.
Tôi thường tạo các bản sao như vậy khi đa luồng và truyền các đối tượng thông qua hàng đợi tin nhắn. Nếu tạo đối tượng nhanh, tôi thường chuyển một bản sao của đối tượng gốc vì nó thực sự đơn giản hóa các vấn đề về quyền sở hữu đối tượng.
IOW, tôi thích viết
Send(TMyObject.Create(obj));
hoặc
Send(obj.Clone);
để
newObj := TMyObject.Create;
newObj.Assign(obj);
Send(newObj);
Tôi sẽ bỏ phiếu cho câu trả lời của bạn, nhưng điều này sẽ phá hủy số điểm 5,555 của bạn. ;-) Chúc mừng! – splash
Vâng, tôi muốn đạt 6666 một ngày :-) –
OK, thông tin cho bạn đây! +1 – splash