Hallo,
Das mit dem inherited wird aber so nicht funktionieren, zumindest in neueren Delphi-Versionen.
Das ist fast richtig. Nur es war schon immer so und nicht erst in neueren Delphi Versionen.
Da ruft TPersistent.Assign intern TPersistent.AssignTo auf, welches nur einen Fehler wirft und sonst nichts tut.
Das würde ich präziser ausdrücken.
TPersistent.Assign(Source: TPersistent)
ruft
Source.AssignTo(Self)
auf. Und die Implementierung von AssignTo in TPersistent wirft eine
Exception.
Daraus folgt, dass man inherited nur dann aufruft, wenn die beiden Klassen nicht kompatibel sind.
Nicht ganz richtig. Das inherited ruft man auf, wenn die Basisklasse das übergebene Objekt behandeln kann und wenn man das übergebene Objekt nicht behandeln will. Also so:
Delphi-Quellcode:
type
TMyClass1 = class(TPersistent)
public
Nr : Integer;
NachName : string;
Vorname : string;
Telnr : string;
procedure Assign(Source: TPersistent); override;
end;
TMyClass2=Class(TMyClass1)
public
PLZ : string;
FremdNr : Integer;
procedure Assign(Source: TPersistent); override;
end;
implementation
{ TMyClass1 }
procedure TMyClass1.Assign(Source: TPersistent);
begin
if Source is TMyClass1 then
Nr := TMyClass1(Sender).Nr;
NachName:= TMyClass1(Sender).NachName;
Vorname := TMyClass1(Sender).Vorname;
Telnr := TMyClass1(Sender).Telnr;
end
else
inherited;
end;
{ TMyClass2 }
procedure TMyClass2.Assign(Source: TPersistent);
begin
if Source is TMyClass2 then
inherited;
PLZ := TmyClass2(Sender).PLZ;
FremdNr := TmyClass2(Sender).FremdNr;
end
else
inherited;
end;
Und AssignTo überschreibt man, wenn man in der Zielklasse keine Änderung vornehmen kann oder in der Zielklasse die Quellklasse nicht zur Verfügung hat.
einbeliebigername.