Comment puis-je créer un Delphi objet à partir d'une classe de référence et d'assurer le constructeur de l'exécution?
Comment puis-je créer une instance d'un objet à l'aide d'une classe de référence, et
s'assurer que le constructeur est exécuté?
Dans cet exemple de code, le constructeur de TMyClass ne sera pas appelé:
type
TMyClass = class(TObject)
MyStrings: TStrings;
constructor Create; virtual;
end;
constructor TMyClass.Create;
begin
MyStrings := TStringList.Create;
end;
procedure Test;
var
Clazz: TClass;
Instance: TObject;
begin
Clazz := TMyClass;
Instance := Clazz.Create;
end;
Vous devez vous connecter pour publier un commentaire.
Utiliser ceci:
Alternativement, vous pouvez utiliser un type jette à TMyClass (au lieu de "classe de TMyClass").
Alexandre solution est excellent mais ne suffit pas dans certaines situations. Supposons que vous souhaitez mettre en place un TClassFactory classe où TClass les références peuvent être stockées au cours de l'exécution et de l'arbitraire d'un certain nombre de cas les retrouver plus tard sur.
Une telle classe d'usine ne sais rien sur les types réels des classes qu'il détient et ne peut donc pas les jeter dans leur fonction méta-classes. Pour appeler la bonne constructeurs dans de tels cas, l'approche suivante fonctionnera.
Tout d'abord, nous avons besoin d'une simple démonstration de classe (ne vous occupez pas des champs publics, c'est juste pour les besoins de la démonstration).
Maintenant on instancie un objet de type THuman purement par RTTI et avec le bon appel de constructeur.
Vous trouverez que les objets "human1" et "human2" ont été initialisés à zéro, c'est à dire, Nom=" et Age=0, ce qui n'est pas ce que nous voulons. L'objet human3 au lieu détient les valeurs par défaut fournies par le constructeur de THuman.
Noter, cependant, que cette méthode nécessite de vos classes pour avoir les méthodes constructeur avec pas de paramètres. Tous les ci-dessus n'a pas été conçu par moi, mais a expliqué brillantly et dans beaucoup plus de détails (par exemple, le c.Partie libre) dans Rob Amour à l'Angle technique.
Veuillez vérifier si une substitution de AfterConstruction est une option.
Votre code légèrement modifié:
Vous pouvez créer une méthode abstraite dans la classe de base, et de l'appeler dans le constructeur, et de remplacer dans les classes enfant à être exécuté lors de la création de la classe de référence.