2017-04-26 3 views
2

J'ai récemment utilisé le System.Versionclass et je me suis demandé pourquoi, et quelques autres classes suffisamment simples, sont marqués comme Sealed (NotInheritable dans VB).Pourquoi certaines classes du CLR sont-elles scellées?

Contrairement à certaines classes plus complexes, je ne vois pas ce qu'une telle classe gagnerait en étant scellée. Pour autant que je peux dire le source pour Version n'indique aucune raison.

Y a-t-il une raison publiée/officielle (c'est-à-dire pas d'opinion) pour cela? Y a-t-il un problème qui pourrait être causé par sa dérivation? Spécifiquement pour le cas de Version, ou à défaut pour des classes aussi simples. Contexte: J'ai dû recréer la classe Version pour la rendre plus facile à utiliser avec une liaison bidirectionnelle car la version MS a des propriétés ReadOnly. Mais je dois savoir si dériver causerait une question

+1

Est-ce que cette réponse assez http://stackoverflow.com/a/7777674/920557? voir la partie [2] –

+0

@EugeneKomisarenko Merci, un peu. La partie 1 montre clairement pourquoi un programmeur * application * peut sceller une classe (par opposition à un programmeur CLR). La deuxième partie donne des informations qui semblent logiques, mais qui sont basées sur l'hérésie et n'ont pas beaucoup de sens étant donné que les classes de base MS sont là pour nous éviter de travailler, sans nous obliger à les dupliquer. Je préférerais une source/raison plus concrète si possible. – Toby

+0

Je crois en la conception pour l'héritage ou en l'interdisant. Concevoir pour l'héritage prend un peu de travail et limite généralement les implémentations plus loin. Dans cette optique, les cours devraient être scellés ou conçus pour pouvoir en hériter. Que faire si vous avez une implémentation d'une classe de base sur laquelle vous n'avez aucun contrôle? Une classe scellée empêche les problèmes de classe de base sur lesquels vous n'avez aucun contrôle et qui ne sont pas destinés à être hérités. – Codexer

Répondre

1

Version est une classe qui représente une « valeur », semblable à DateTime, mais étant trop volumineux pour tenir confortablement dans une struct, il est class. Les mêmes principes de conception s'appliquent, cependant. Les types représentant des valeurs doivent être immuables et scellés (les types de valeur sont toujours scellés).

Vous pouvez aussi voir clairement d'autres caractéristiques des valeurs:

  • object.Equals et object.GetHashCode ont été réinitialisée.
  • Il implémente IEquatable<Version>
+0

Existe-t-il une règle, ou une règle de base sur quand une structure est "trop ​​grande"? Venant d'un fond de C, j'aime généralement garder mes structures uniquement pour les champs; s'ils ont besoin de fonctionnalités, alors c'est une classe. – Toby

+2

@Toby, pour des directives générales, voir: [Choix entre classe et structure] (https://msdn.microsoft.com/en-us/library/ms229017 (v = vs.110) .aspx). – TnTinMn

+0

Pour ma future référence, dans cette situation spécifique, ma classe "BetterVersion" devrait probablement * envelopper * la classe CLR 'Version' plutôt que d'en hériter (relation" is-a "), en la composant (" has-a " relation) ou de le reproduire. – Toby