Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Zu unbekanntem Klassenderivat casten?

  Alt 13. Mär 2009, 09:42
Hallo.

Vielen Dank für eure zahlreichen Antworten!

Sowohl die Meta-Klassen als auch die virtuell-abstrakten Clone-Methoden haben funktioniert:

Delphi-Quellcode:
type
  TBasis = class(TObject)
    Test: string;
    constructor Create;
    function Clone: TBasis; virtual; abstract;
  end;

  TAbleitung = class(TBasis)
    Test: string;
    constructor Create;
    function Clone: TBasis; override;
  end;

  TBaseClassType = class of TBasis;

{ TForm1 }

procedure TForm1.CloneVariant(Sender: TObject);
var
  Original, Kopie: TBasis;
  TempType: TBaseClassType;
begin
  Original:= TAbleitung.Create; // Dynamisch ermittelt, Derivat unbekannt
  Original.Test := 'Hubbi';

  TempType := TBaseClassType(Original.ClassType);

  Kopie := TBasis(TempType.Create);
  Kopie.Test := 'Flubby';

  showmessage(Original.Test);
  showmessage(Original.ClassName);
  showmessage(Kopie.Test);
  showmessage(Kopie.ClassName);

  // Ausgegeben:
  // Create Ableitung; Create Basis; Create Basis;
  // Hubbi; TAbleitung; Flubby; TAbleitung (OK)
end;

procedure TForm1.MetaClassVariant(Sender: TObject);
var
  Original, Kopie: TBasis;
begin
  Original := TAbleitung.Create; // Dynamisch ermittelt, Derivat unbekannt
  Original.Test := 'Hubbi';

  Kopie := Original.Clone;
  Kopie.Test := 'Flubby';

  showmessage(Original.Test);
  showmessage(Original.ClassName);
  showmessage(Kopie.Test);
  showmessage(Kopie.ClassName);

  // Ausgegeben:
  // Create Ableitung; Create Basis; Create Ableitung; Create Basis;
  // Hubbi; TAbleitung; Flubby; TAbleitung (OK)
end;

{ TBasis }

constructor TBasis.Create;
begin
  showmessage('Create Basis');
  inherited;
end;

{ TAbleitung }

constructor TAbleitung.Create;
begin
  showmessage('Create Ableitung');
  inherited;
end;

function TAbleitung.Clone: TBasis;
begin
  result := TAbleitung.Create;
  result.Test := Test;
end;
Ich denke, dass ich die Metaklassen verwenden werde, da dadurch mein Code aufgrund der nicht zu implementierenden Clone-Methoden etwas schlanker bleibt.

Ist das jetzt alles OK, was ich hier gemacht habe?

@stoxx: Mein Code funktioniert scheinbar, obwohl ich nicht folgende Hinweise beachtet habe:

Zitat:
// constructor create von TBASIS muss virtual deklariert sein (oder virutal; abstract)
// constructor create von TAbleitungA muss als override; deklariert werden
Wieso ist das so? Ist mein Code damit noch nicht in Ordnung und sollte ich etwas ändern?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat