Ich möchte je nach Konfiguration eine Klasse C von Klasse A oder Klasse B vererben.
Klasse A und B implementieren bestimmte Methoden (hier Test0) komplett unterschiedlich, aber Klasse C macht immer das gleiche.
Ich kann auch nicht Klasse C als gemeinsamen Vorfahren implementieren, da C in der Kette ganz unten sein muss.
Bisher ging das mit einem Kompilerschalter, der je nach Konfiguration unterschiedliche Klassen erzeugte.
In Zukunft sollen aber beides zur Laufzeit alternativ möglich sein, deshalb brauche ich eine andere Lösung.
Möglich wäre das über includes, das ist aber nicht sehr übersichtlich und wenig elegant.

Code: Alles auswählen
TTest=class
procedure Test0; virtual;abstract;
end;
TTestimp=class(TTest)
procedure Test0; override;
end;
TTestimp1=class(TTestimp)
procedure Test0; override;
end;
...
TTesta=class(TTestimp)
procedure Test0; override;
end;
TTest_b=class(TTestimp1)
procedure Test0; override;
end;
{ TTest_c }
{$IFDEF a}
TTest_c=class(TTesta)
{$ENDIF }
{$IFDEF b}
TTest_c=class(TTestb)
{$ENDIF }
procedure Test0; override;
end;
Code: Alles auswählen
TTest_c=class <TTest>
procedure Test0; override;
end;
var
aTestclass:TTest;
begin
if a then
aTestclass := TTest_c<TTesta>.create
else
aTestclass := TTest_c<TTestb>.create;
end;