Appel de membre virtuel dans un constructeur

Appel de membre virtuel dans un constructeur


Source : Stack Overflow).)

Lorsqu’un objet écrit en C# est construit, ce qui se passe c’est que les initialiseurs s’exécutent dans l’ordre de la classe la plus dérivée vers la classe de base, puis les constructeurs s’exécutent dans l’ordre de la classe de base vers la classe la plus dérivée (voir le blog d’Eric Lippert pour les détails sur la raison de ce comportement).

De plus, dans .NET, les objets ne changent pas de type pendant leur construction, mais commencent en tant que type le plus dérivé, avec la table de méthodes correspondant au type le plus dérivé. Cela signifie que les appels de méthodes virtuelles s’exécutent toujours sur le type le plus dérivé.

Lorsque vous combinez ces deux faits, vous vous retrouvez avec le problème suivant : si vous effectuez un appel de méthode virtuelle dans un constructeur, et que ce n’est pas le type le plus dérivé dans sa hiérarchie d’héritage, cet appel sera effectué sur une classe dont le constructeur n’a pas encore été exécuté, et qui pourrait donc ne pas être dans un état approprié pour que cette méthode soit appelée.

Ce problème est, bien entendu, atténué si vous marquez votre classe comme sealed pour vous assurer qu’elle est le type le plus dérivé dans la hiérarchie d’héritage - auquel cas il est parfaitement sûr d’appeler la méthode virtuelle.