2009-05-28 13 views

Répondre

31

Par exemple, si vous avez une classe qui ne devrait être créé grâce à des méthodes d'usine. Ou si vous avez des surcharges du constructeur, et que certaines d'entre elles ne devraient être utilisées que par les autres constructeurs. Probablement d'autres raisons aussi = =

+2

En fait, lorsque vous devez contrôler l'instanciation de classe, cela peut se faire via un modèle d'usine ou un modèle singleton. –

+0

@ André: Et votre point est? Ce serait toujours une raison pour avoir des constructeurs privés. Sauf si votre classe d'usine est une classe différente, mais c'est un sujet différent. – Svish

11

Chaque fois que vous voulez empêcher l'instanciation directe d'une classe de l'extérieur, vous allez utiliser un constructeur private. Par exemple, avant C# 2.0 qui a introduit des classes static, vous avez utilisé un constructeur private pour accomplir à peu près la même chose:

sealed class StaticClass { 
    private StaticClass() { 
    } 
    public static void DoSomething() { 
    } 
} 
1

Tout en this link is related to java, je pense que cela devrait vous aider à comprendre la raison pour laquelle l'idée est à peu près la même.

Les constructeurs privés empêchent une classe d'être explicitement instanciée par les appelants. Il y a quelques cas communs où un constructeur privé peut être utile:

  • classes contenant uniquement des méthodes utilitaires statiques
  • classes contenant des constantes ne
  • de type énumérations de sécurité
  • singletons
2

Par exemple lorsque vous fournissez des méthodes d'usine pour contrôler l'instanciation ...

public class Test(){ 

    private Test(){ 
    } 

    void DoSomething(){ 
    // instance method 
    } 

    public static Test CreateCoolTest(){ 
    return new Test(); 
    } 
} 
9

Lorsque vous souhaitez empêcher les utilisateurs de votre classe d'instancier directement la classe. Certains cas communs sont:

  • classes ne contenant que des méthodes statiques
  • singletons
7

Je peux rappeler quelques usages pour elle:

  • Vous pouvez l'utiliser à partir d'une méthode de fabrication statique à l'intérieur de la même classe
  • Vous pourriez faire un travail commun à l'intérieur et ensuite l'appeler à partir d'autres contructures
  • Vous pouvez l'utiliser pour empêcher l'exécution d'ajouter un contructure vide automatiquement
  • Il pourrait être utilisé (bien que privé) de certains outils de moqueries et ORM (comme NHibernate)
12

Si vous connaissez un certain modèle de conception, c'est évident: une classe pourrait créer une nouvelle instance de lui-même en interne, et ne pas laisser les autres le faire. Un exemple en Java (je ne sais pas C# assez, désolé) avec un singleton classe:

class Meh 
{ 
    private Meh() { } 
    private static Meh theMeh = new Meh(); 
    public static Meh getInstance() { return theMeh; } 
} 
+17

De façon assez humoristique, ce Java est aussi valide en C# - peut-être connaissez-vous plus de C# que vous ne le pensez. ;) –

1

Vous pouvez l'utiliser avec l'héritage dans le cas où les arguments au constructeur de la classe de base sont de types différents à ceux du constructeur de classes enfant mais vous avez toujours besoin de la fonctionnalité de la classe de base dans la classe enfant, par exemple. méthodes protégées.

Généralement cela devrait être évité autant que possible car c'est une mauvaise forme d'héritage à utiliser.

0

Et bien sûr, vous pouvez utiliser le constructeur privé pour empêcher le sous-classement.

2

Les constructeurs privés sont utilisés pour empêcher la création d'instances d'une classe lorsqu'il n'existe aucun champ ou méthode d'instance, telle que la classe Math, ou lorsqu'une méthode est appelée pour obtenir une instance d'une classe. Si toutes les méthodes de la classe sont statiques, pensez à rendre la classe entière statique. Pour plus d'informations, consultez Classes statiques et Membres de classe statique.

class NLog 
{ 
    // Private Constructor: 
    private NLog() { } 

    public static double e = System.Math.E; //2.71828... 
} 

Voici un exemple de classe utilisant un constructeur privé.

public class Counter 
{ 
    private Counter() { } 
    public static int currentCount; 
    public static int IncrementCount() 
    { 
     return ++currentCount; 
    } 
} 

class TestCounter 
{ 
    static void Main() 
    { 
     // If you uncomment the following statement, it will generate 
     // an error because the constructor is inaccessible: 
     // Counter aCounter = new Counter(); // Error 

     Counter.currentCount = 100; 
     Counter.IncrementCount(); 
     System.Console.WriteLine("New count: {0}", Counter.currentCount); 
    } 
} 
1

Je suis en retard dans le jeu, mais la lecture de toutes les autres réponses, je ne vois pas cet usage mentionné:

J'utilise les constructeurs privés dans des scénarios où j'ai plusieurs constructeurs (publics) , et ils ont tous du code en commun. Avec le chaînage du constructeur, le code devient vraiment net et SEC. Rappelez-vous, les variables readonly privées ne peuvent être définies que dans les constructeurs, donc je ne peux pas utiliser une méthode régulière.

Exemple:

public class MyClass 
{ 
    private readonly int _a; 
    private readonly int _b; 
    private readonly string _x; 

    public MyClass(int a, int b, string x) 
     : this(x) 
    { 
     _a = a; 
     _b = b; 
    } 

    public MyClass() 
     : this("(not set)") 
    { 
     // Nothing set here... 
    } 

    private MyClass(string x) 
    { 
     _x = x; 
    } 
} 
1
lorsque vous suivez un modèle de conception singleton

Fondamentalement, vous utilisez les constructeurs privés. Dans ce cas, vous avez défini une méthode statique dans la classe qui appelle le constructeur privé en interne. Pour créer l'instance de la classe pour la première fois, l'utilisateur appelle classname.static_method_name. Dans cette méthode, puisque l'objet de la classe n'existe pas encore, la méthode statique appelle en interne le constructeur privé et renvoie l'instance de la classe.

Si l'instance de la classe existe déjà, la méthode statique renvoie simplement l'instance à la méthode appelante.

Questions connexes