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