Je veux savoir pourquoi une classe Singleton devrait être scellée. Si nous donnons au constructeur comme privé, nous pouvons empêcher que la classe soit dérivée .. Ci-dessous, je colle quelques lignes de MSDN. S'il vous plaît donnez-moi une certaine couleur dessus. P>
Dans cette stratégie, l'instance est créée la première fois que tout membre de la classe est référencé. L'exécution de la langue commune s'occupe de l'initialisation variable. La classe est
marquée scellée pour empêcher la dérivation, qui pourrait ajouter des instances forte>. Pour une discussion sur les avantages et les inconvénients de marquer une classe scellée, voir [Sells03]. De plus, la variable est marquée en lecture seule, ce qui signifie qu'elle ne peut être attribuée que pendant l'initialisation statique (qui est montrée ici) ou dans un constructeur de classe. P> blockQuote>
3 Réponses :
C'est une sorte de lignes directrices de conception qui, évidemment, vous pouvez suivre ou non. Il s'agit simplement de marquer vos intentions de conception comme dans le cas d'une classe de base qui le marquait comme abstrait code> pour éviter un désordre possible dans un avenir. P>
Le mot-clé code> scellé code> signifie que la classe ne peut pas être héritée. Déclarant des constructeurs privés signifie que les instances de la classe ne peuvent pas être créées. P>
Ce ne sont pas la même chose. Vous pouvez avoir une classe de base avec un constructeur privé, mais hériter toujours de cette classe de base, définissez certains constructeurs publics et instanciez efficacement cette classe de base. P>
N'oubliez pas que les constructeurs ne sont pas hérités (la classe dérivée n'aura donc pas tous les constructeurs privés simplement parce que la classe de base), et que les classes dérivées appellent toujours les constructeurs de classe de base en premier. Marquage de la classe scellé code> empêche une personne de travailler de manière triviale autour de votre classe singleton soigneusement construite car elle empêche une personne de hériter de la classe. P>
Vous ne pouvez obtenir que de la classe de base si la classe dérivée a accès au constructeur privé i>. Voir ma réponse pour la seule façon dont cela est réalisable.
Cependant, je ne suis pas capable de construire le code de code suivant de la classe BASECLASS {Private BASECLASS () {}} Class DERRIVED: BASECLASS {Public Void Affichage () {Console.WRITELINE ("CLASSE DROITE"); }} et j'obtiens une erreur comme Baseclass.baseclass () 'est inaccessible en raison de son niveau de protection
Si nous donnons au constructeur comme privé, nous pouvons empêcher que la classe soit dérivée? P>
pas assez em>: p>
xxx pré> ceci fonctionne car
privé code> accès est limité au texte programme < / em> du type, y compris des types imbriqués. Donc
carsesfoidagain code> a accès au constructeur privé de
notrealysingleton code>. P>
mais même laissant cela de côté, si votre l'intention em> est que Personne ne peut dériver de la classe, pourquoi ne voudriez-vous pas signaler cette intention aussi clairement que possible, via
scellé code>? p> blockQuote>
@Jonskeet Pourquoi quelqu'un voudrait-il dériver de votre classe dans votre classe? Ceci est un scénario inhabituel. Si quelqu'un peut modifier votre classe, ils peuvent également ajouter un constructeur paramétré public. L'insertion d'un constructeur devrait être plus facile que d'insérer une classe complète.
@Deepakmishra: Il y a de bonnes raisons de le faire en général, par exemple. Le bon i> code dans CodeBlog.jonskeet.uk/2014/10/23/... . Mais plus important encore, la question affirme i> que tous les constructeurs privés empêchent la dérivation et la réponse réfute cette affirmation. Que ce soit ou non une bonne idée est distincte de savoir si l'assertion est valide ou non.
@Jonskeet hmm, vous avez raison, la question demande cette réponse.