126 votes

Pourquoi une structure C # ne peut-elle pas être héritée?

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?

121voto

Jesse Millikan Points 2265

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.

52voto

Darin Dimitrov Points 528142

Parce que c'est ainsi que les structures sont représentées dans .NET. Ce sont des types valeur et les types valeur n'ont pas de pointeur de table de méthode permettant l'héritage.

24voto

Robert Paulson Points 10792

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é.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X