Einzelnen Beitrag anzeigen

r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#7

AW: Generics: Instanz-Erzeugung in generischer Klasse

  Alt 10. Okt 2011, 09:07
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat