Ich denke mal nicht, denn in der generischen Klasse ist TButton nicht bekannt sondern nur abstrakt als T (irgendwas ab TComponent).
Genau das ist das Problem, ja.
Zitat:
Nachfahren von TComponent können aber auch den Constructor überschreiben:
Delphi-Quellcode:
TMyComponent = class(TComponent)
public
constructor Create; reintroduce;
end;
und schon gibt es für diese Ableitung kein
Create(AOwner:TComponent)
mehr.
Das stimmt nicht. Du siehst doch schon am reintroduce, dass hier nichts überschrieben, sondern maximal verdeckt wird. Der alte Konstruktor existiert also weiterhin. Zudem unterscheiden sich die Signaturen, was bedeutet, dass das reintroduce unnötig ist, da noch nichtmal verdeckt, sondern nur überladen wird.
Was mich ja eher irritiert, ist dass das der Compiler TButton hier überhaupt zulässt. Ich bin jetzt kein experte in Delphi-Generics, aber
TGenericLink<T: TComponent, Constructor>
bedeutet doch wohl, dass T einen parameterlosen Konstruktor haben muss. Und TButton hat AFAIR keinen. Das sollte der Compiler doch eigentlich bemeckern. Oder wo ist mein Denkfehler?
Im übrigen gibt es mit ziemlicher Sicherheit eine schönere Lösung, als dein Workaround. Vermutlich über
RTTI. Sowas in der Art macht Delphi ja bei den Formulardaten, die aus den dfms gelesen werden. Auch da müssen TComponent-Nachfahren dynamisch erzeugt werden, ohne, dass die konkrete Klasse zur Designzeit schon klar wäre.
mfg
Christian