Das wird genutzt, wenn eine Klasse (A) später Objekte (Y, Z) erstellen muss, die von einem bestimmten Typ (X) abgeleitet wurden. Ein kurzes Beispiel:
Delphi-Quellcode:
type
// das ist Typ X
TGeometry = class
public
function MyName: String; virtual; abstract;
end;
TGeometryClass = class of TGeometry;
// das ist Klasse A
TGeometryMaker = class
private
FCurrentGeometryClass: TGeometryClass;
public
function GetNextGeometry: TGeometry;
property CurrentGeometryClass: TGeometryClass read FCurrentGeometryClass write FCurrentGeometryClass;
end;
function TGeometryMaker.GetNextGeometry: TGeometry;
begin
Result := CurrentGeometryClass.Create;
end;
type
// Typ Y (von X abgeleitet)
TRectangle = class(TGeometry)
public
function MyName: String; override;
end;
function TRectangle.MyName: String;
begin
Result := 'na Rechteck!';
end;
type
// Typ Z (von X abgeleitet)
TCircle = class(TGeometry)
public
function MyName: String; override;
end;
function TCircle.MyName: String;
begin
Result := 'Ich bin ein Kreis.';
end;
Jetzt erstellen wir mal ein Form mit einem Button und einem Memo und fügen diesen Code ins Button-OnClick ein:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
Geo: TGeometry;
begin
// jetzt erstellen wir unsere Klasse, welche uns später objekte vom typ
// TGeometry zurück liefert
with TGeometryMaker.Create do
try
// als erstes erstellen wir ein rechteck
CurrentGeometryClass := TRectangle;
Geo := GetNextGeometry;
try
Memo1.Lines.Add(Geo.MyName);
finally
Geo.Free;
end;
// jetzt noch einen kreis
CurrentGeometryClass := TCircle;
Geo := GetNextGeometry;
try
Memo1.Lines.Add(Geo.MyName);
finally
Geo.Free;
end;
finally
Free;
end;
end;
Meistens wird diese Methode genutzt, wenn man ein Framework für eine Logik liefern will, aber nicht den Gesamtumfang beschränken will.
...
...
Daniel W.
Ich bin nicht zurück, ich tue nur so