Das Kopieren von Objekten findet über die Methode
Assign statt!
Dazu muss das Zielobjekt von
TPersistent abgeleitet sein.
Die Assign-Methode hat immer folgenden Aufbau:
Delphi-Quellcode:
procedure TVerpackung.Assign(Source: TPersistent);
begin
if Source
is TVerpackung
then
begin
FIdVerp := TVerpackung(Source).IdVerp;
FBezeichnung := TVerpackung(Source).Bezeichnung;
FVLength := TVerpackung(Source).VLength;
FVHeight := TVerpackung(Source).VHeight;
FVWidth := TVerpackung(Source).VWidth;
FTara := TVerpackung(Source).Tara;
FPicture.Assign(Source);
// Unterobjekt kopieren
...
end
else
// Ganz wichtig:
// wenn ich die Klasse von "Source" nicht kenne,
// dann immer inherited aufrufen
// Könnte sein, dass ein Parentklasse die Zuweisung vornehmen kann
// falls nicht, hat die VCL noch einen Supertrick in der Hinterhand
// es wird die Methode AssignTo aufgerufen
// falls dies auch fehlschlägt, gibt's ein Exception
inherited;
end;
Der
Copy-Constructor ist der schnelle Ersatz für folgenden Code:
Delphi-Quellcode:
objA := TEinObjekt.Create;
objA.Assign(objB);
Der Copy-Constructor macht dann Sinn, wenn in .Create viele Properties zugewiesen werden,
nur um dann in .Assign überbügelt zu werden.
Ganz allgemein ist aber die Assign-Methode wertvoller, da mit ihr auch Objekte unterschiedlicher Klassen
kopiert werden können.
Wenn ein Objekt UnterObjekte hat, dann gibt es zwei Varianten:
1.) nur Hauptobjekt wird kopiert. Bei den Unterobjekten werden nur Referenzen kopiert (2 Zeiger auf's gleiche Objekt)
2.) "Deep-Copy": auch die Unterobjekte werden sauber über Assign kopiert. Alle Objekte sind nun völlig unabhängig voneinander.
Delphi-Quellcode:
constructor TPageCollection.Create(pc: TPageCollection);
begin
inherited Create;
FInnerList := TList.Create;
// die TList-Klasse weiss nicht, dass seine Items Objekte sind
// also wird hier kein "Deep-Copy" ausgeführt
FInnerList.Assign(pc.FInnerList);
Es wäre nun zu prüfen, ob
TObjectList.Assign einen Depp-Copy ausführt.