{$APPTYPE CONSOLE}
type
TFruchtKorbFactory =
class;
TFrucht =
class
function GibFruchtKorb(
const factory: TFruchtKorbFactory): TObject;
virtual;
abstract;
end;
TBanane =
class(TFrucht)
function GibFruchtKorb(
const factory: TFruchtKorbFactory): TObject;
override;
end;
TApfel =
class(TFrucht)
function GibFruchtKorb(
const factory: TFruchtKorbFactory): TObject;
override;
end;
TFruchtKorbFactory =
class
function CreateInstance(
const banane: TBanane): TObject;
overload;
function CreateInstance(
const apfel: TApfel): TObject;
overload;
end;
TGenericDings<T: TFrucht,
constructor> =
class
procedure Wuppdi;
end;
{ TBanane }
function TBanane.GibFruchtKorb(
const factory: TFruchtKorbFactory): TObject;
begin
Result := factory.CreateInstance(Self);
end;
{ TApfel }
function TApfel.GibFruchtKorb(
const factory: TFruchtKorbFactory): TObject;
begin
Result := factory.CreateInstance(Self);
end;
{ TFruchtKorbFactory }
function TFruchtKorbFactory.CreateInstance(
const apfel: TApfel): TObject;
begin
Writeln('
erstelle fruchtkorb für apfel');
end;
function TFruchtKorbFactory.CreateInstance(
const banane: TBanane): TObject;
begin
Writeln('
erstelle fruchtkorb für banane');
end;
{ TGenericDings<T> }
procedure TGenericDings<T>.Wuppdi;
var
frucht: T;
factory: TFruchtKorbFactory;
begin
frucht := T.Create;
// das hier wird für den virtual dispatch von GetWhatever benötigt
frucht.GibFruchtKorb(factory);
// Was hier nicht gehen würde wäre: factory.CreateInstance(frucht);
end;
var
apfeldings: TGenericDings<TApfel>;
bananendings: TGenericDings<TBanane>;
begin
apfeldings.Wuppdi;
bananendings.Wuppdi;
end.