Pourquoi avons-nous besoin d’un constructeur privé?

Si une classe a un constructeur privé, elle ne peut pas être instanciée. Donc, si je ne veux pas que ma classe soit instanciée et l’utilise toujours, alors je peux la rendre statique.

A quoi sert un constructeur privé?

En outre, il est utilisé dans la classe singleton, mais à part cela, existe-t-il d’autres utilisations?

(Note: La raison pour laquelle j’exclue le cas singleton ci-dessus est que je ne comprends pas pourquoi nous avons besoin d’un singleton quand il y a une classe statique disponible. Vous ne pouvez pas répondre à cette question.)

Usine

Les constructeurs privés peuvent être utiles lors de l’utilisation d’un motif de fabrique (en d’autres termes, une fonction statique utilisée pour obtenir une instance de la classe plutôt qu’une instanciation explicite).

public class MyClass { private static Dictionary cache = new Dictionary(); private MyClass() { } public static MyClass GetInstance(object data) { MyClass output; if(!cache.TryGetValue(data, out output)) cache.Add(data, output = new MyClass()); return output; } } 

Pseudo-scellé avec des enfants nesteds

Toutes les classes nestedes qui héritent de la classe externe peuvent accéder au constructeur privé.

Par exemple, vous pouvez l’utiliser pour créer une classe abstraite dont vous pouvez hériter, mais personne d’autre (un constructeur internal pourrait également y travailler pour restreindre l’inheritance à un seul assembly, mais le constructeur private force toutes les implémentations à être des classes nestedes. )

 public abstract class BaseClass { private BaseClass() { } public class SubClass1 : BaseClass { public SubClass1() : base() { } } public class SubClass2 : BaseClass { public SubClass2() : base() { } } } 

Constructeur de base

Ils peuvent également être utilisés pour créer des constructeurs “de base” appelés à partir de différents constructeurs plus accessibles.

 public class MyClass { private MyClass(object data1, ssortingng data2) { } public MyClass(object data1) : this(data1, null) { } public MyClass(ssortingng data2) : this(null, data2) { } public MyClass() : this(null, null) { } } 

Comme Stefan, Adam et d’autres l’ont fait remarquer, les constructeurs privés sont utiles dans les cas où il n’est pas souhaitable qu’une classe soit créée par du code en dehors de la classe . Les singletons, les usines, les objects de méthodes statiques sont des exemples où être capable de restreindre un type de construction est utile pour imposer un modèle particulier.

Pour répondre à la deuxième partie de votre question sur les raisons pour lesquelles les singletons sont nécessaires, si des classes statiques existent, les singletons et les classes statiques ne sont pas équivalentes.

Par exemple, une classe singleton peut implémenter une interface, une classe statique ne peut pas. Un object singleton peut être transmis aux méthodes en tant que paramètre – ce n’est pas si facile à faire avec les classes statiques sans recourir aux objects wrapper ou à la reflection. Il existe également des cas où vous souhaiterez peut-être créer une hiérarchie d’inheritance dans laquelle une (ou plusieurs) des classes de feuille sont des singleton – cela n’est pas possible non plus avec les classes statiques. Comme autre exemple, vous pouvez avoir plusieurs singletons différents et vous pouvez vouloir en créer un à l’exécution en fonction de parameters environnementaux ou de parameters de configuration. Cela n’est pas possible avec les classes statiques.

Il est important de comprendre les fonctionnalités linguistiques et de choisir la bonne pour le poste – elles sont là pour une raison.

Parfois, vous ne devriez pas pouvoir instancier une classe. Cela rend cela explicite et applique cela au niveau du compilateur.

Les singletons ne sont qu’un cas d’utilisation. Les classes de constantes, les classes de méthodes statiques et d’autres types de modèles imposent qu’une classe ne soit pas instanciable.

Eh bien, si votre seul objective est que vous ne voulez pas qu’il soit instancié, alors il est suffisant de le rendre statique.

Si, otoh, vous ne voulez simplement pas qu’il soit instancié en dehors de la classe (peut-être voulez-vous que les utilisateurs en obtiennent une en utilisant une fabrique statique sur la classe). des usines pour l’instancier.

Historiquement, rappelez-vous que rendre une classe statique n’a pas toujours été autour de vous. Rendre le ctor privé était un moyen de le rendre non instanciable (est-ce un mot?) Avant que le mot-clé statique puisse être appliqué à une classe …

But de créer le constructeur privé dans une classe

  1. Pour restreindre une classe héritée.

  2. Restreindre une classe en étant instanciée ou en créant plusieurs instances / objects.

  3. Pour atteindre le modèle de conception singleton.

     public class TestPrivateConstructor { private TestPrivateConstructor() { } public static int sum(int a , int b) { return a + b; } } class Program { static void Main(ssortingng[] args) { // calling the private constructor using class name directly int result = TestPrivateConstructor.sum(10, 15); // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class } } 

Vous pouvez l’utiliser pour forcer une instance de singleton ou créer une classe de fabrique .

Une méthode statique peut appeler le constructeur privé pour créer une nouvelle instance de cette classe.

Par exemple une instance singleton:

 public class Foo { private Foo (){} private Foo FooInstance {get;set;} public static Foo GetFooInstance () { if(FooInstance == null){ FooInstance = new Foo(); } return FooInstance; } } 

Cela permet de créer une seule instance de la classe.

En ce qui concerne les singletons – singleton est un modèle de conception utilisé lorsque l’environnement et les exigences satisfont des motivations similaires pour l’utilisation du modèle; les classes statiques sont une fonctionnalité de langage.

Comme l’ explique la réponse de LBushkin , alors que certains des objectives de l’utilisation de singleton peuvent être atteints en utilisant des classes statiques, une implémentation particulière de singleton peut dépasser l’ensemble de fonctionnalités des classes statiques seules.

  • Une utilisation de construction privée est lorsque nous avons seulement un membre statique.
  • Une fois que nous fournissons un constructeur privé ou public ou autre, le compilateur ne nous permettra pas d’append un constructeur public sans parameters à la classe.
  • Si nous voulons créer un object de classe même si nous avons des constructeurs privés, nous devons avoir un constructeur public avec un constructeur privé

Si la classe a UNIQUEMENT des constructeurs privés, elle ne peut pas être instanciée de l’extérieur.

Vous pouvez également avoir des constructeurs privés et des constructeurs publics avec des signatures différentes.

Si vous voulez créer une fabrique pour une classe, vous pouvez utiliser une construction privée et append des méthodes “factory” statiques à la classe elle-même pour créer la classe.

La classe Graphics , avec les méthodes From *, en est un exemple.