web-dev-qa-db-fra.com

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 quand même, 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 une autre utilisation?

(Remarque: la raison pour laquelle j'exclus 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 pour ma confusion dans la question.)

58
Rasshme Chawla

Usine

Les constructeurs privés peuvent être utiles lors de l'utilisation d'un modèle d'usine (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<object, MyClass> cache = 
        new Dictionary<object, MyClass>();

    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 enfants imbriqués

Toute classe imbriquée qui hérite de la classe externe peut accéder au constructeur privé.

Par exemple, vous pouvez utiliser ceci pour créer une classe abstraite dont vous peut hériter, mais personne d'autre (un constructeur internal travaillerait également ici pour limiter l'héritage à un seul assembly, mais le constructeur private force toutes les implémentations à être des classes imbriquées.)

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 constructeurs différents, plus accessibles. 

public class MyClass
{
    private MyClass(object data1, string data2) { }

    public MyClass(object data1) : this(data1, null) { }

    public MyClass(string data2) : this(null, data2) { }

    public MyClass() : this(null, null) { }
}
60
Adam Robinson

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 un code extérieur à la classe . Les singletons, les fabriques, les objets de méthode statique sont des exemples de cas où il est utile de restreindre la construction d'un type pour appliquer un modèle particulier.

Pour répondre à la deuxième partie de votre question sur les raisons pour lesquelles les singletons sont nécessaires s'il existe des classes statiques: singletons et les classes statiques sont non équivalentes. 

Par exemple, une classe singleton peut implémenter une interface, pas une classe statique. Un objet singleton peut être transmis aux méthodes en tant que paramètre. Ce n'est pas si facile à faire avec des classes statiques sans recourir à des objets wrapper ou à des réflexions. Il existe également des cas où vous pouvez créer une hiérarchie d'héritage dans laquelle une (ou plusieurs) des classes feuille sont singleton - ceci n'est pas possible non plus avec les classes statiques. Comme autre exemple, vous pouvez avoir plusieurs singletons différents et vous pouvez vouloir instancier l'un d'eux au moment de l'exécution en fonction de paramètres environnementaux ou de configuration - ceci n'est également pas possible avec les classes statiques.

Il est important de comprendre les fonctionnalités de la langue et de choisir celle qui convient au poste, car elles existent pour une raison.

31
LBushkin

Parfois, vous ne devriez pas pouvoir instancier une classe. Cela rend ceci explicite et l’applique 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 indiquent qu'une classe ne doit pas être instanciable.

15
Stefan Kendall

Eh bien, si votre seul objectif est que vous ne vouliez pas qu’il soit instancié, le rendre statique suffit. 

Si, otoh, vous ne voulez tout simplement pas qu'il soit instancié en dehors de la classe, (vous ne voulez peut-être que les utilisateurs en obtiennent une en utilisant une fabrique statique sur la classe) - alors vous avez besoin d'un acteur privé pour les autoriser les usines pour l'instancier.

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

2
Charles Bretana

Vous pouvez l’utiliser pour forcer un singleton instance ou créer une factory class. 

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 à une seule instance de la classe d'être créée. 

2
kemiller2002

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

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

  2. Restreindre une classe en cours d'instancier ou de créer plusieurs instances/objets.

  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(string[] 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
        }
    }
    
2

Concernant les singletons - singleton est un modèle de conception utilisé lorsque l'environnement et les exigences répondent à des motivations similaires pour l'utilisation du modèle. les classes statiques sont une fonctionnalité du langage.

Tandis que la réponse de LBushkin discute, si certains des objectifs de l’utilisation de singleton peuvent être atteints à l’aide de classes statiques, une implémentation particulière de singleton peut dépasser le seul ensemble de fonctionnalités de classes statiques.

1
Cade Roux

Si la classe SEULEMENT a 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 différentes signatures.

0
Cade Roux

Si vous souhaitez créer une fabrique pour une classe, vous pouvez utiliser une construction privée et ajouter des méthodes statiques "fabrique" à la classe elle-même pour créer la classe.

Un exemple de ceci est le Graphics class, avec les méthodes From *.

0
GvS