Einzelnen Beitrag anzeigen

einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#16

AW: Daten zwischen Klassen übertragen (mit RTTI?)

  Alt 13. Okt 2016, 09:34
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.
  Mit Zitat antworten Zitat