96 votes

Pourquoi sceller une classe?

J'aimerais savoir quelle est la motivation derrière la majorité des classes scellées dans le cadre .Net. Quel est l'avantage de sceller une classe? Je ne peux pas comprendre comment ne pas autoriser l'héritage peut être utile et probablement pas le seul à lutter contre ces classes.

Alors, pourquoi le cadre est-il conçu de cette manière et ne serait-il pas un changement radical d’annuler tout? Il doit y avoir une autre raison mais juste être méchant?

101voto

Jon Skeet Points 692016

Les Classes doivent être conçues soit pour de l'héritage ou de l'interdire. Il y a un coût à la conception d'héritage:

  • Il peut déterminer votre mise en place (vous devez déclarer les méthodes vont à l'appel à d'autres méthodes, dans le cas où un utilisateur remplace l'un mais pas l'autre)
  • Elle révèle votre mise en œuvre plutôt que de simplement les effets
  • Cela signifie que vous avez à penser à d'autres possibilités lors de la conception de
  • Des choses comme des Égaux sont difficiles à concevoir dans un arbre d'héritage
  • Il exige plus de documentation
  • Immuable type qui est sous-classé peut devenir mutable (ick)

L'article 17 de l'Effectif Java va plus de détails sur ce indépendamment du fait que c'est écrit dans le contexte de Java, le conseil s'applique à .NET ainsi.

Personnellement, je souhaite que les classes ont été scellées par défaut .NET.

41voto

CVertex Points 7334
  • Parfois, les classes sont trop précieux et ne sont pas conçus pour être héritée.
  • Runtime/Réflexion peut faire de l'héritage des hypothèses sur les classes scellées lors de la recherche pour les types. Un grand exemple de ceci est - Attributs sont recommandés pour être scellé pour la recherche d'exécution de la vitesse. type.GetCustomAttributes(typeof(MyAttribute)) sera beaucoup plus rapide si MyAttribute est scellé.

L'article MSDN pour cette rubrique est de Limiter l'Extensibilité par l'Étanchéité des Classes.

4voto

bruno conde Points 28120

J'ai trouvé cette phrase dans la documentation de msdn: "Les classes scellées sont principalement utilisées pour empêcher la dérivation. Comme elles ne peuvent jamais être utilisées en tant que classe de base, certaines optimisations d'exécution peuvent accélérer légèrement l'appel des membres des classes scellées."

Je ne sais pas si la performance est le seul avantage des classes scellées et personnellement, j'aimerais également connaître d'autres raisons ...

3voto

Peter Parker Points 13770

La Performance est un facteur important pour exemple, la classe string en java est définitive(<- scellé) et la raison pour cela est la performance uniquement. Je pense qu'un autre point important est d'éviter le caractère fragile de la classe de base problème décrit en détail ici: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes.aspx

Si vous fournissez un cadre, il est important pour la maintenabilité de l'héritage de projets et à la mise à niveau de votre cadre pour éviter le caractère fragile de la classe de base problème

1voto

ihebiheb Points 306

Sealed est utilisé pour prévenir le "problème de classe de base fragile". J'ai trouvé un bon article dans MSDN qui explique cela.

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