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.
...
...