TClass est déclaré "Class of TObject
" dans system.pas. Quel constructeur est appelé est décidé à la compilation, et tout le compilateur sait quelle classe de base vous utilisez. Il ne sait pas quelle sera la valeur de la variable quand elle s'exécutera, elle doit donc être définie par défaut sur la classe de base. Si vous utilisez un TClass, votre classe de base est TObject.
Si vous utilisez une variable de classe, je suppose que vous avez une sorte de hiérarchie et que vous essayez d'implémenter une fabrique. Si vous voulez vous assurer que le bon constructeur est appelé en fonction de la valeur d'une variable de classe au moment de l'exécution, pas quelque chose contenu dans votre code au moment de la compilation, vous avez besoin d'un constructeur virtuel.
type
TMyBaseObject = class(TObject)
public
constructor Create; virtual;
end;
TMyClass = class of TMyBaseObject;
Utilisez un TMyClass au lieu d'un TClass comme variable de classe, et maintenant le compilateur génère un appel à TMyBaseObject.Create, qui est virtuel. Assurez-vous que toutes vos classes dérivées remplacent le constructeur de base, et vous finirez par appeler le bon à l'exécution.
+1 merci! Y a-t-il quelque chose de négatif sur le fait que le constructeur soit virtuel? Plus précisément, existe-t-il une raison pour laquelle TObject.Create n'est pas virtuel? – jpfollenius
Probablement parce qu'il n'est pas nécessaire que ce soit virtuel. Tout d'abord, les appels de méthode virtuelle ne fonctionnent qu'avec des signatures identiques, et la plupart des constructeurs prennent au moins un paramètre. Deuxièmement, si vous utilisez le modèle d'usine de cette façon, vous voulez probablement un descendant d'une classe spécifique de toute façon. –