Einzelnen Beitrag anzeigen

Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Tutorial zur DP-Collection

  Alt 1. Sep 2005, 13:12
Zitat von alcaeus:
Zitat von Khabarakh:
Hat nichts mit der DP-Collection zu tun, aber sollte man nicht besser AssignTo statt Assign überschreiben? Ist mit Free/Destroy vergleichbar, Assign/Free prüft den Pointer auf nil, dann wird das vom Programmierer überschriebene AssignTo/Destroy aufgerufen.
Koenntest du mir das evtl. nochmal genauer erklaeren? Auch in den Vorstellungsthreads der DP-Collection wird Assign ueberschrieben, ich wusste bis jetzt ja nichtmal dass es AssignTo gibt
Als ich mich zu Beginn der Ferien mit Komponentenentwicklung auseinandergesetzt habe, hab ich diese Zeile in den Delphi-Sourcen gesehen:
Delphi-Quellcode:
procedure TPersistent.Assign(Source: TPersistent);
begin
  if Source <> nil then Source.AssignTo(Self) else AssignError(nil);
end;
Ich bin davon ausgegangen, dass das Ganze wie mit Free/Destroy funktioniert: Assign wird vom Programmierer nicht überschrieben, sondern bleibt immer gleich. Es testet den Pointer auf nil und ruft dann AssignTo auf, das vom Programmierer überschrieben und mit Anweisungen zum Kopieren der neuen Felder ergänzt wurde.

Gerade habe ich es mir noch einmal genauer angesehen und festgestellt, dass es etwas komplizierter ist .
Angenommen, wir wollen eine neue Klasse schreiben, diese Klasse soll die Daten einer anderen vorhandenen Klasse kopieren können und umgekehrt, obwohl beide Klassen als nächste gemeinsame Basisklasse erst TPersistent gemein haben. Für den einen Weg reicht es, Assign der neuen Klasse zu überschreiben und die Daten zu kopieren. Der andere Weg wird komplizierter, schließlich müssten wir Assign der vorhandenen Klasse überschreiben, diese wollen wir jedoch nicht ändern. Hier nimmt uns aber Delphi die Arbeit ab. Eine Instanz unserer neuen Klasse werde also der anderen als Parameter von Assign übergeben. Nun werden alle Assigns der ganzen Hierarchie bis zu TPersistent aufgerufen, da nirgendwo das Verhalten für das Kopieren unserer Klasse definiert ist. Logisch, wir haben die Klasse ja gerade erst geschrieben. Da die alte Klasse die neue Klasse nicht kopieren kann, ruft TPersistent.Assign nun AssignTo der neuen Klasse auf, damit diese sich in die alte Klasse kopiert. IMO einfach genial !
Aber solange man nur gleiche Klassentypen kopieren will, ist es wohl ziemlich egal, welche Methode man überschreibt . bei AssignTo kann man sich aber sicher sein, dass der Parameter ungleich nil ist.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat