En C # et C ++ / CLI, le mot-clé sealed
(ou NotInheritable
en VB) est utilisé pour protéger une classe de toute chance d'héritage (la classe ne sera pas héritable). Je sais qu'une caractéristique de la programmation orientée objet est l'héritage et je pense que l'utilisation de sealed
va à l'encontre de cette fonctionnalité, elle arrête l'héritage. Y a-t-il un exemple qui montre les avantages sealed
et quand il est important de l'utiliser?
Un addendum à l'excellente réponse de Baboon :
Dans le même ordre d'idées, applicable uniquement aux classes non scellées: toute méthode créée
virtual
est un point d'extension, ou du moins ressemble à un point d'extension. Déclarer des méthodesvirtual
doit également être une décision consciente. (En C #, c'est une décision consciente; en Java, ce n'est pas le cas.)EDIT : Quelques liens pertinents:
Notez également que Kotlin scelle les classes par défaut; son
open
mot-clé est l'opposé de Javafinal
ousealed
de C # . (Pour être sûr, il n'y a pas d'accord universel sur le fait que c'est une bonne chose .)la source
Marquer une classe comme
Sealed
empêche la falsification de classes importantes qui peuvent compromettre la sécurité ou affecter les performances.Plusieurs fois, sceller une classe a également du sens lorsque l'on conçoit une classe utilitaire avec un comportement fixe, que nous ne voulons pas changer.
Par exemple, l'
System
espace de noms dansC#
fournit de nombreuses classes qui sont scellées, telles queString
. S'il n'est pas scellé, il serait possible d'étendre ses fonctionnalités, ce qui pourrait être indésirable, car il s'agit d'un type fondamental avec une fonctionnalité donnée.De même,
structures
inC#
sont toujours implicitement scellés. Par conséquent, on ne peut pas dériver une structure / classe d'une autre structure. Le raisonnement en est qu'ilsstructures
sont utilisés pour modéliser uniquement des types de données autonomes, atomiques, définis par l' utilisateur, que nous ne voulons pas modifier.Parfois, lorsque vous créez des hiérarchies de classes, vous souhaiterez peut-être limiter une certaine branche de la chaîne d'héritage, en fonction de votre modèle de domaine ou de vos règles métier.
Par exemple, a
Manager
etPartTimeEmployee
sont tous deux desEmployee
s, mais vous n'avez aucun rôle après les employés à temps partiel de votre organisation. Dans ce cas, vous souhaiterez peut-être scellerPartTimeEmployee
pour éviter toute nouvelle ramification. D'un autre côté, si vous avez des employés à temps partiel à l'heure ou à la semaine, il peut être judicieux d'en hériterPartTimeEmployee
.la source
unseal
la classe plus tard, si nécessaire, de la sceller et de casser toutes les classes qui en dépendent.Je pense que cet article a un bon point, le cas spécifique était lorsque vous essayez de convertir une classe non scellée sur une interface aléatoire, le compilateur ne lance pas d'erreur; mais quand scellé est utilisé, le compilateur renvoie une erreur qu'il ne peut pas convertir. La classe scellée apporte une sécurité d'accès au code supplémentaire.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla
la source