Tippen Sie einfach auf die richtige Klasse:
%Vor%Auch ist es wahrscheinlich eine gute Idee, den Konstruktor virtuell zu machen.
Sie sollten in Erwägung ziehen, der Basisklasse eine explizite Methode zur Initialisierung zu geben, anstatt den Konstruktor zu verwenden:
%Vor%Das funktioniert natürlich nur, wenn die Basisklasse und alle Unterklassen unter Ihrer Kontrolle stehen.
Aktualisieren
Die von @TOndrej angebotene Lösung ist dem, was ich unten geschrieben habe, weit überlegen, abgesehen von einer Situation. Wenn Sie Laufzeitentscheidungen treffen müssen, welche Klasse erstellt werden soll, dann scheint der folgende Ansatz die optimale Lösung zu sein.
Ich habe meine Erinnerung an meine eigene Codebasis aufgefrischt, die sich auch mit genau diesem Problem beschäftigt. Meine Schlussfolgerung ist, dass das, was Sie erreichen wollen, unmöglich ist. Ich würde mich freuen, falsch erwiesen zu werden, wenn jemand sich dieser Herausforderung stellen möchte.
Meine Problemumgehung besteht darin, dass die generische Klasse ein Feld FClass
vom Typ class of TMyBaseClass
enthält. Dann kann ich meinen virtuellen Konstruktor mit FClass.Create(...)
aufrufen. Ich teste das FClass.InheritsFrom(T)
in einer Assertion. Es ist alles bedrückend nicht-generisch. Wie gesagt, wenn jemand meinen Glauben falsch beweisen kann, werde ich ihn aufwerten, löschen und freuen!
In Ihrer Einstellung könnte die Problemumgehung wie folgt aussehen:
%Vor% Eine noch elegantere Lösung ist, wenn möglich, einen parameterlosen Konstruktor zu verwenden und die zusätzlichen Informationen in einer virtuellen Methode von T
, vielleicht Initialize
genannt, einzugeben.
Wie scheint in Delphi XE zu funktionieren, rufen Sie zunächst T.Create auf und rufen Sie anschließend die klassenspezifische Create als Methode auf. Dies ist ähnlich der Antwort von Rudy Velthuis (gelöscht), obwohl ich keinen überladenen Konstruktor einführe. Diese Methode scheint auch korrekt zu funktionieren, wenn T TControl oder Klassen wie diese ist, so dass Sie visuelle Kontrollen auf diese Weise konstruieren können.
Ich kann nicht auf Delphi 2010 testen.
%Vor%