Je lis CLR via C # par Jeffery Richter et il dit qu'une struct est un type valeur et ne peut pas être hérité. Pourquoi pas? Des raisons techniques? Ou philosophiques?
- Pourquoi les structs ne supportent-ils pas l'héritage ? (5 réponses )
Réponses
Trop de publicités?Un peu des deux.
Philosophiquement, ça marche - il y a des classes, qui sont les "vrais" bloc de construction pour la programmation orientée objet, et il y a des structures, qui sont légers types de données pour le stockage mais de permettre à l'objet-comme les appels de méthode pour la connaissance et la commodité.
Techniquement, être une "valeur type" signifie que l'ensemble de la structure - l'ensemble de son contenu - sont (généralement) stockées partout où vous disposez d'une variable ou d'un membre de ce type. Comme une variable locale ou un paramètre de la fonction, cela signifie que sur la pile. Pour les variables de membre, ce qui signifie entièrement stockées en tant que partie de l'objet.
En tant que un (primaire) pourquoi, par exemple, l'héritage est un problème, pensez à la façon dont le stockage est affecté à un niveau bas si vous avez autorisé les structs d'avoir des sous-types avec plus de membres. Rien que le stockage type struct mettrait en place un montant variable de mémoire en fonction du sous-type, il a fini contenant, ce qui serait une allocation cauchemar. Un objet d'une classe donnée n'aurait plus une constante, taille connue au moment de la compilation et il en serait de même pour la pile d'images de tout appel de méthode. Cela ne se produit pas pour les objets qui ont de stockage alloué sur le tas et à la place de la constante de la taille des références pour que la mémoire sur la pile ou à l'intérieur d'autres objets.
Vous pouvez trouver les réponses à la Question Pourquoi .La valeur NETTE des types de scellés? pertinents. En elle, @logicnp se réfère à l'ECMA 335, qui stipule:
8.9.10 type de la Valeur de l'héritage
- [...]
- Seront scellés afin d'éviter de traiter les complications de la valeur de la découper.
- Le plus restrictif des règles spécifiées ici plus pour permettre une mise en œuvre efficace sans compromettre sévèrement la fonctionnalité.