248 votes

Pourquoi ne ' t j’ai hériter d’une classe statique ?

J’ai plusieurs classes qui n’ont pas vraiment besoin de n’importe quel état. D’un point de vue organisationnel, je tiens à mettre dans la hiérarchie.

Mais il semble que je ne peux pas déclarer l’héritage pour les classes statiques.

Quelque chose comme ça :

ne fonctionnera pas.

Pourquoi les concepteurs du langage ont fermé cette possibilité ?

190voto

boj Points 5284

Citation à partir d' ici:

C'est en fait par la conception. Il semble y avoir aucune bonne raison pour hériter d'une classe statique. Il a public static membres que vous pouvez toujours y accéder via le nom de la classe elle-même. Les seules raisons que j'ai vu pour l'héritage statique de choses ont été mauvaises, telles que l'enregistrement d'un couple de personnages de la dactylographie.

Il y a peut-être lieu d'envisager des mécanismes pour amener les membres statiques directement dans le champ d'application (et nous à fait envisager cette après les Orques cycle de vie des produits), mais statique de l'héritage de classe n'est pas la voie à suivre: Il est dans le mauvais mécanisme à utiliser, et fonctionne uniquement pour les membres statiques qui résident dans une classe statique.

(Mads Torgersen, Langage C# H)

D'autres avis de channel 9

De l'héritage .NET ne fonctionne que sur l'instance de la base. Les méthodes statiques sont définis au niveau du type pas sur le niveau de l'instance. C'est pourquoi prépondérant ne fonctionne pas avec des méthodes statiques/propriétés/événements...

Les méthodes statiques ne sont tenus qu'une fois en mémoire. Il n'y a pas de table virtuelle etc. qui est créé pour eux.

Si vous appelez une méthode d'instance .NET, vous donnons toujours l'instance en cours. Ce qui est caché par le .NET, mais ça arrive. Chaque méthode d'instance a comme premier argument un pointeur (de référence) de l'objet sur lequel la méthode est exécutée. Ce n'est pas le cas avec les méthodes statiques (tels qu'ils sont définis sur le type de niveau). Comment le compilateur décider de sélectionner la méthode à invoquer?

(littleguru)

Et comme une idée intéressante, littleguru a une partielle "solution" à ce problème: le Singleton pattern.

77voto

Andrew Hare Points 159332

La principale raison que vous ne pouvez pas hériter d’une classe statique est qu’ils sont abstract et sealed (cela empêche également toute instance d'entre eux d’être créé).

Donc, ce :

Compile pour ce IL :

25voto

Joel Coehoorn Points 190579

Pensez-y de cette façon: vous accédez à des membres statiques par le type de nom, comme ceci:

MyStaticType.MyStaticMember();

Avez-vous été à héritent de cette classe, vous auriez accès via le nouveau nom de type:

MyNewType.MyStaticMember();

Ainsi, le nouvel article ne porte pas de relations à l'original quand il est utilisé dans le code. Il n'y aurait pas moyen de tirer parti de toute relation d'héritage pour des choses comme le polymorphisme.

Peut-être que vous pensez, vous voulez juste de prolonger certains des éléments de la classe d'origine. Dans ce cas, rien ne vous empêche de simplement à l'aide d'un membre de l'original dans un genre entièrement nouveau.

Peut-être que vous voulez ajouter des méthodes à un type statique. Vous pouvez le faire déjà via les méthodes d'extension.

Peut-être que vous voulez être en mesure de passer à une statique Type à une fonction au moment de l'exécution et de l'appeler une méthode de ce type, sans savoir exactement ce que la méthode ne. Dans ce cas, vous pouvez utiliser une Interface.

Donc, à la fin vous n'avez pas vraiment gagner quelque chose d'hériter de classes statiques.

3voto

Amit Points 325

Ce que vous voulez réaliser à l’aide de la hiérarchie des classes est possible seulement par le biais d’espace de nommage. Ainsi les langages qui prennent en charge namespapces (comme c#) n’aura aucun utilisation de la mise en œuvre de la hiérarchie des classes de classes statiques. Étant donné que vous ne pouvez pas instancier les classes, tout ce dont vous avez besoin est une organisation hiérarchique des définitions de classes que vous pouvez obtenir grâce à l’utilisation des espaces de noms

3voto

Yogesh Karekar Points 21

Vous pouvez utiliser la composition place... ce qui vous permettra d’accéder aux objets de la classe du type statique. Mais toujours cant implémente des interfaces ou des classes abstraites

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