Pourquoi sceller une classe?

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

alors, pourquoi est-ce que le cadre est conçu de cette façon et ne serait-ce pas un changement révolutionnaire pour tout desceller? Il doit y avoir une autre raison que le mal?

89
demandé sur mmiika 2008-11-06 13:40:48

10 réponses

  • parfois, les classes sont trop précieuses et ne sont pas conçues pour être héritées.
  • 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 bon exemple de cela est - les attributs sont recommandés pour être scellés pour la vitesse d'exécution de la recherche. type.GetCustomAttributes(typeof (MyAttribute)) fonctionnera beaucoup plus rapidement si MyAttribute est scellé.

L'article MSDN pour ce sujet est la Limitation de l'Extensibilité par l'Étanchéité des Classes .

38
répondu CVertex 2008-11-06 10:46:32
Les Classes

devraient soit être conçues pour l'héritage, soit l'interdire. Il y a un coût à concevoir pour l'héritage:

  • il peut épingler votre implémentation (vous devez déclarer quelles méthodes vont appeler quelles autres méthodes, dans le cas où un utilisateur l'emporte sur l'une mais pas l'autre)
  • il révèle votre mise en œuvre plutôt que seulement les effets
  • cela signifie que vous devez penser à plus de possibilités quand la conception de
  • les choses comme les égaux sont difficiles à concevoir dans un arbre héréditaire
  • il faut plus de documentation
  • un type immuable qui est sous-classé peut devenir mutable (ick)

L'article 17 de Java efficace va dans plus de détails à ce sujet - indépendamment du fait qu'il est écrit dans le contexte de Java, le Conseil s'applique aussi à .NET.

personnellement je souhaite des cours ont été scellés par défaut .NET.

93
répondu Jon Skeet 2008-11-06 11:09:38

il semble que les Official Microsoft guidelines on sealing ont évolué depuis que cette question a été posée ~il y a 9 ans, et ils sont passés d'une philosophie opt-in (seal by default) à opt-out (don't seal by default):

X ne pas sceller les classes sans avoir une bonne raison de le faire.

sceller une classe parce que vous ne pouvez pas penser à un scénario d'extensibilité n'est pas une bonne raison. Les utilisateurs de Framework aiment hériter de classes pour diverses raisons non évidentes, comme l'ajout de membres convenance. Voir Classes non scellées pour des exemples de raisons non évidentes hériter d'un type.

les bonnes raisons de sceller une classe sont les suivantes:

  • La classe est une classe statique. Voir Conception De Classe Statique.
  • la classe stocke des secrets sensibles à la sécurité dans l'héritage des membres protégés.
  • La classe hérite de nombreux membres virtuels et le coût de sceller individuellement, l'emporteraient sur les avantages de quitter la classe desceller.
  • la classe est un attribut qui nécessite une exécution très rapide look-up. Les attributs scellés ont des niveaux de performance légèrement plus élevés que descellés. Voir Les Attributs.

X ne pas déclarer protégé ou membres virtuels sur des types scellés.

par définition, les types scellés ne peuvent pas être hérités. Cela signifie que les membres protégés sur les types scellés ne peuvent pas être appelés, et virtuel les méthodes sur les types scellés ne peuvent pas être supplantées.

✓ considérez scellant les membres que vous outrepassez. Les problèmes qui peuvent résulter de l'introduction de membres virtuels (discuté dans les Membres Virtuels) s'appliquent à des remplacements ainsi, quoique de façon un peu dans une moindre mesure. Sceller un contrôleur vous protège de ces problèmes à partir de ce point dans la hiérarchie d'héritage.

en effet, si vous rechercher la ASP.Net code de base , vous ne trouverez qu'environ 30 occurences de sealed class , dont la plupart sont des attributs et des classes de test.

je pense que la conservation de l'immuabilité est un bon argument en faveur de la chasse au phoque.

5
répondu Ohad Schneider 2017-09-14 11:59:23

j'ai trouvé cette phrase dans la documentation msdn: "Scellé classes sont principalement utilisé pour prévenir la dérivation. Parce qu'ils ne peuvent jamais être utilisés comme classe de base, certaines optimisations de temps d'exécution peuvent rendre l'appel de membres de classe scellés légèrement plus rapide."

Je ne sais pas si la performance est le seul avantage de classes scellées et personnellement je voudrais aussi connaître d'autres raisons ...

3
répondu bruno conde 2008-11-06 10:47:08

la Performance est un facteur important par exemple, la classe string en java est finale(<- sealed) et la raison en est la performance seulement. Je pense qu'un autre point important est d'éviter le problème de classe de base fragile 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 les projets d'héritage de maintenabilité et de mettre à jour votre cadre pour éviter le caractère fragile de la classe de base problème

2
répondu Peter Parker 2008-11-06 11:07:20
"151900920 Scellés" est utilisé pour prévenir le "fragile de la classe de base problème". J'ai trouvé un bon article dans MSDN qui explique cela.

1
répondu ihebiheb 2012-11-10 00:13:51

scellement vous permet de réaliser des gains de performance mineurs. Cela est moins vrai dans le monde de la jits et de la pessimisation paresseuse que dans le monde de, disons C++, mais puisque .NET n'est pas aussi bon que la pessimisation java compilateurs sont principalement en raison de philosophies de conception différentes, il est encore utile. Il indique au compilateur qu'il peut appeler directement n'importe quelle méthode virtuelle plutôt que de les appeler indirectement par le biais du vtable.

Il est également important lorsque vous voulez un " fermée monde " pour des choses comme la comparaison d'égalité. Normalement, une fois que j'ai défini une méthode virtuelle, je suis assez cloué pour définir une notion de comparaison d'égalité qui met vraiment en œuvre l'idée. Sur l'autre main, je pourrais être capable de le définir pour une sous-classe de la classe avec la méthode virtuelle. Sceller cette classe garantit que l'égalité tient vraiment.

0
répondu Edward KMETT 2008-11-06 15:31:08

sceller une classe rend la gestion des ressources jetables plus facile.

0
répondu Jeff Dunlop 2015-06-04 05:00:59

pour déterminer s'il faut sceller une catégorie, une méthode ou un bien, vous devez généralement tenir compte des deux points suivants:

"151900920 •* les avantages potentiels que l'établissement de classes pourrait gagner par la capacité de personnaliser votre classe.

* la possibilité que le calcul de classes puisse modifier vos classes de telle sorte qu'elles ne fonctionnent plus correctement ou comme prévu.

0
répondu user3629577 2018-02-01 10:44:37

une autre considération est que les classes scellées ne peuvent pas être stubbed dans vos tests unitaires. De documentation de Microsoft :

Les classes scellées

ou les méthodes statiques ne peuvent pas être brisées parce que les types de goujons dépendent de la répartition virtuelle de la méthode. Dans de tels cas, utilisez les types de cale décrits dans Utiliser des cales pour isoler votre application des autres assemblages pour les essais unitaires

0
répondu Dave Clark 2018-05-18 09:20:20