Jakie są plusy i minusy powielania instancji obiektu z funkcją konstruktora lub instancji?Poprawny sposób duplikowania obiektu Delphi
Przykład 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;
Przykład 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;
Główną różnicą bezpośrednio do głowy - w tym drugim przypadku, konstruktor Tworzenie musiałby być wirtualnej, które hierarchii klas wspierania Klon mógł zostać zbudowany na bazie TMyObject.
Załóżmy, że to nie jest problem - że TMyObject i wszystko na nim oparte jest całkowicie pod moją kontrolą. Jaki jest twój preferowany sposób tworzenia konstruktora kopiowania w Delphi? Którą wersję uważasz za bardziej czytelną? Kiedy używałbyś poprzedniego lub drugiego podejścia? Omawiać. :)
EDIT: Moim głównym problemem z pierwszym przykładzie jest to, że zastosowanie jest bardzo ciężki w porównaniu do drugiego podejścia, tj
newObj := TMyObject.Create(oldObj)
vs.
newObj := oldObj.Clone;
EDIT2 lub „Dlaczego Chcę działać w trybie jednokierunkowym "
Zgadzam się, że w większości przypadków funkcja przypisania jest rozsądnym podejściem. Jest nawet rozsądne implementowanie "konstruktora kopii" wewnętrznie, po prostu używając assign.
Zazwyczaj tworzę takie kopie podczas wielowątkowości i przekazywania obiektów przez kolejkę komunikatów. Jeśli tworzenie obiektów jest szybkie, zwykle przekazuję kopię oryginalnego obiektu, ponieważ to naprawdę upraszcza problem własności obiektu.
IOW, wolę pisać
Send(TMyObject.Create(obj));
lub
Send(obj.Clone);
do
newObj := TMyObject.Create;
newObj.Assign(obj);
Send(newObj);
Głosowałbym za twoją odpowiedzią, ale to zniszczyłoby twój 5,555 wynik. ;-) Gratulacje! – splash
Cóż, chcę osiągnąć 6666 jeden dzień :-) –
OK, proszę bardzo! +1 – splash