12
votes

Pourquoi la classe Singleton devrait-elle être scellée?

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.

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 . 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.

http://msdn.microsoft.com/en-us/library/ FF650316.aspx


0 commentaires

3 Réponses :


0
votes

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 pour éviter un désordre possible dans un avenir.


0 commentaires

2
votes

Le mot-clé scellé 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.

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.

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é 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.


2 commentaires

Vous ne pouvez obtenir que de la classe de base si la classe dérivée a accès au constructeur privé . 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



13
votes

Si nous donnons au constructeur comme privé, nous pouvons empêcher que la classe soit dérivée?

pas assez : xxx

ceci fonctionne car privé accès est limité au texte programme < / em> du type, y compris des types imbriqués. Donc carsesfoidagain a accès au constructeur privé de notrealysingleton .

mais même laissant cela de côté, si votre l'intention est que Personne ne peut dériver de la classe, pourquoi ne voudriez-vous pas signaler cette intention aussi clairement que possible, via scellé ?


3 commentaires

@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 code dans CodeBlog.jonskeet.uk/2014/10/23/... . Mais plus important encore, la question affirme 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.