J'aimerais savoir quelle est la motivation derrière la plupart des classes scellées dans le framework .Net. Quel est l'avantage de sceller une classe? Je ne peux pas imaginer 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 façon et ne serait-ce pas un changement inconditionnel de tout desceller? Il doit y avoir une autre raison, mais simplement être mauvais?
.net
performance
mmiika
la source
la source
Réponses:
L'article MSDN de cette rubrique est la limitation de l'extensibilité en scellant les classes .
la source
Les classes doivent être conçues pour l'héritage ou l'interdire. Il y a un coût à concevoir pour l'héritage:
Le point 17 de Effective Java donne plus de détails à ce sujet - indépendamment du fait qu'il soit écrit dans le contexte de Java, les conseils s'appliquent également à .NET.
Personnellement, je souhaite que les classes soient scellées par défaut dans .NET.
la source
Il semble que les directives officielles de Microsoft sur le scellement ont évolué depuis que cette question a été posée il y a environ 9 ans et qu'elles sont passées d'une philosophie d'acceptation (sceller par défaut) à se désinscrire (ne pas sceller par défaut):
En effet, si vous recherchez la base de code ASP.Net Core , vous ne trouverez qu'environ 30 occurrences 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 du scellement.
la source
J'ai trouvé cette phrase dans la documentation msdn: "Les classes scellées sont principalement utilisées pour empêcher la dérivation. Comme elles ne peuvent jamais être utilisées comme classe de base, certaines optimisations d'exécution peuvent rendre l'appel des membres de classe scellés légèrement plus rapide."
Je ne sais pas si la performance est le seul avantage des classes scellées et personnellement j'aimerais aussi connaître d'autres raisons ...
la source
Les performances sont un facteur important, par exemple, la classe de chaîne en java est finale (<- scellée) et la raison en est uniquement les performances. 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 hérités de maintenabilité et de mettre à niveau votre cadre pour éviter le problème de classe de base fragile
la source
String
classe pourrait même ne pas être possible de sous-classe, même si elle n'était pas définitive.Scellé est utilisé pour éviter le "problème de classe de base fragile". J'ai trouvé un bon article dans MSDN qui explique cela.
la source
L'étanchéité vous permet de réaliser des gains de performances mineurs. C'est moins vrai dans le monde des JIT et de la pessimisation paresseuse que dans le monde de, disons C ++, mais puisque .NET n'est pas aussi bon que la pessimisation que les compilateurs java le sont principalement à cause de différentes philosophies de conception, il est toujours utile. Il indique au compilateur qu'il peut appeler directement toutes les méthodes virtuelles plutôt que de les appeler indirectement via la vtable.
C'est également important lorsque vous voulez un «monde fermé» pour des choses comme la comparaison d'égalité. Normalement, une fois que j'ai défini une méthode virtuelle, je suis à peu près tenté de définir une notion de comparaison d'égalité qui implémente vraiment l'idée. D'un autre côté, je pourrais peut-être le définir pour une sous-classe particulière de la classe avec la méthode virtuelle. Sceller cette classe garantit que l'égalité tient vraiment.
la source
Sceller une classe facilite la gestion des ressources jetables.
la source
Pour déterminer s'il faut sceller une classe, une méthode ou une propriété, vous devez généralement considérer les deux points suivants:
• Les avantages potentiels que les classes dérivées pourraient tirer de la possibilité de personnaliser votre classe.
• La possibilité que les classes dérivées puissent modifier vos classes de telle sorte qu'elles ne fonctionneraient plus correctement ou comme prévu.
la source
Une autre considération est que les classes scellées ne peuvent pas être stubbées dans vos tests unitaires. À partir de la documentation de Microsoft :
la source