Question

J'ai lu que les constructeurs virtuels sont utilisés pour implémenter certains modèles de conception, mais je n'ai pas compris le besoin de constructeurs virtuels. Alors, quels sont les constructeurs virtuels et pourquoi nous en avons vraiment besoin?

Était-ce utile?

La solution

Dans la plupart des langages de programmation, il est impossible de trouver des constructeurs virtuels. Le remplacement d'un membre virtuel est évalué au moment de l'exécution après la construction d'un objet, mais dans la plupart des langues, vous devez connaître la classe réelle lors de la construction de l'instance. Par conséquent, les constructeurs virtuels n’ont aucun sens dans ces langages.

Dans .NET, vous pouvez obtenir une solution similaire par réflexion, c’est-à-dire que vous pouvez construire un objet via une instance de la classe Type qui représente l’objet que vous voulez construire. Et avec le support générique, vous pouvez également obtenir quelque chose de similaire, mais ce ne sont pas des constructeurs virtuels.

Le seul langage de programmation avec lequel j'ai travaillé qui ait de vrais constructeurs virtuels est Delphi. Dans Delphi, il existe un "type de métaclasse" spécifique, c’est-à-dire une construction de programmation spécifique qui représente une métaclasse (alors que dans .NET, la méta classe, la classe Type , n’est qu’une instance classe). Donc, si vous avez une classe appelée TMyClass - Conventions de nommage Deplhi;)

TMyClass : Class ...

Vous pouvez déclarer la métaclasse comme ceci

TMyMetaClass : class of TMyClass

Vous pouvez maintenant déclarer une variable de type TMyMetaClass ,

MyMetaClassVariable : TMyMetaClass
... 
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;

Et vous pouvez construire une nouvelle instance grâce à cette variable

MyClassInstance := MyMetaClassVariable.Create();

Désormais, MyMetaClassVariable peut faire référence à toute classe qui est TMyClass ou à une de ses spécialisations. Si le constructeur est déclaré virtuel, la variable sera construite avec une instance de cette classe spécifique.

De la même manière, vous pouvez déclarer des méthodes statiques virtuelles dans Delphi et les appeler via une instance de la métaclasse.

Alors l'autre question? Pourquoi avons-nous besoin d'eux? Eh bien, dans Delphi, ils résolvent certains des mêmes problèmes que la classe Type dans .NET, vous permettant de construire des objets pour lesquels vous ne connaissez pas le nom de la classe au moment de la conception. Par exemple, lorsque vous concevez un formulaire et que vous insérez un grand nombre de contrôles, ces données doivent être sérialisées par le concepteur et désérialisées. Lorsque le formulaire est désérialisé, ce sont en fait les métatypes qui sont lus et les instances appropriées (que ce soit TextBox , ComboBox , etc.) sont construites en appelant le constructeur virtuel. sur le métatype.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top