Ok, comme tant d'autres personnes ont pesé dans la balance...
Oui, je pense qu'il est tout à fait raisonnable de recommander que les classes soient scellées par défaut.
Cela va dans le sens de la recommandation de Josh Bloch dans son excellent livre Java efficace, 2e édition :
Concevoir pour l'héritage, ou l'interdire.
Concevoir pour l'héritage, c'est dur et peut faire votre mise en œuvre moins flexible, surtout si vous avez des méthodes virtuelles, dont l'une appelle l'autre. Ce sont peut-être des surcharges, peut-être pas. Le fait que l'une appelle l'autre doit être documenté Sinon, vous ne pouvez pas surcharger l'une ou l'autre méthode en toute sécurité - vous ne savez pas quand elle sera appelée, ni si vous pouvez appeler l'autre méthode sans risquer un débordement de pile.
Si, par la suite, vous voulez changer quelle méthode appelle quelle autre dans une version ultérieure, vous ne pouvez pas le faire, car vous risqueriez de casser les sous-classes. Donc, au nom de la "flexibilité", vous avez en fait fait l'implémentation moins flexible, et que vous deviez documenter les détails de votre implémentation de manière plus précise. Cela ne me semble pas être une bonne idée.
Ensuite, il y a l'immuabilité - j'aime les types immuables. Je trouve qu'il est plus facile de raisonner sur eux que sur les types mutables. C'est une des raisons pour lesquelles le Joda Time est plus agréable que l'utilisation de l'API Date
y Calendar
en Java. Mais une classe non scellée ne peut jamais être connu sous le nom de pour être immuable. Si j'accepte un paramètre de type Foo
je pourrai peut-être compter sur les propriétés déclaré dans Foo
de ne pas être modifié au fil du temps, mais je ne peux pas compter sur le fait que l'objet lui-même ne soit pas modifié - il pourrait y avoir une propriété mutable dans la sous-classe. Que le ciel me vienne en aide si cette propriété est également utilisée par une surcharge d'une méthode virtuelle. Dites adieu à bon nombre des avantages de l'immuabilité. (Ironiquement, Joda Time a de très grandes hiérarchies d'héritage - souvent avec des choses disant "les sous-classes doivent être immuables". La grande hiérarchie d'héritage de Chronology
le rendait difficile à comprendre lors du portage en C#).
Enfin, il y a l'aspect de la surutilisation de l'héritage. Personnellement, je préfère la composition à l'héritage lorsque c'est possible. J'adore le polymorphisme pour les interfaces, et le occasionnellement J'utilise l'héritage de l'implémentation - mais c'est rarement un bon ajustement dans mon expérience. Rendre les classes scellées évite qu'elles soient inapproprié dérivé d'où la composition serait mieux adaptée.
EDIT : J'aimerais également indiquer aux lecteurs les sites suivants Article du blog d'Eric Lippert datant de 2004 sur la raison pour laquelle tant de classes du cadre sont scellées. Il y a beaucoup d'endroits où j'aurais aimé que .NET fournisse une fonction interface nous pourrions travailler à la testabilité, mais c'est une demande légèrement différente...
27 votes
La sous-classification est rare ? !
12 votes
Comment le scellement d'une classe améliore-t-il sa lisibilité ?
4 votes
Peut-être que j'exagère un peu, mais j'ai dû utiliser le
sealed
mot-clé sur un cours que j'ai écrit quelques fois dans ma carrière. Donc, non, je ne recommande pas quelque chose comme ça ou Anders Hejlsberg sera en colère contre vous.4 votes
99% de nos classes ne sont pas sous-classées.
0 votes
La lisibilité est améliorée car vous savez que vous n'aurez pas à regarder ailleurs pour voir toutes les utilisations.
7 votes
Il s'agit d'un sujet controversé. Personnellement, j'aimerais aussi que les classes C# soient scellées par défaut, mais il y a beaucoup de gens intelligents des deux côtés...
4 votes
@Darin : Cela signifie-t-il que pour toutes les autres classes que vous avez écrites, vous avez pris en compte les implications de la sous-classification, et avez documenté les attentes des sous-classes ? J'aime l'approche de Josh Bloch qui consiste à "concevoir pour l'héritage ou l'interdire".
1 votes
En C#, les méthodes ne sont pas modifiables par défaut, et Code-Contracts permet un sous-typage correct. Ainsi, sceller une classe ne fait que rendre le code moins réutilisable, et rendre le paradigme plus orienté module qu'orienté objet.
2 votes
@Jon, pour être honnête, non, je ne fais généralement pas tout ce que vous décrivez lorsque j'écris une classe en C# :-)
9 votes
Si 99% de vos classes n'impliquent pas d'héritage, alors il semblerait que la convention "ne pas sous-classer" soit déjà ancrée dans votre organisation et que vous n'ayez pas besoin de la faire respecter.