2009-05-28 8 views

Antwort

31

Zum Beispiel, wenn Sie eine Klasse, die nur durch Fabrikmethoden erstellt werden soll. Oder wenn Sie Überladungen des Konstruktors haben und einige von ihnen nur von den anderen Konstruktoren verwendet werden sollten. Wahrscheinlich aus anderen Gründen als auch =)

+2

Eigentlich, wenn Sie die Klasseninstanziierung steuern müssen, könnte dies durch eine Fabrik oder ein Singleton-Muster sein. –

+0

@ André: Und dein Punkt ist? Das wäre immer noch ein Grund für private Konstrukteure. Es sei denn, Ihre Fabrikklasse ist eine andere Klasse, aber das ist ein anderes Thema. – Svish

11

Jedes Mal, wenn Sie direkte Instanziierung einer Klasse von außen verhindern wollen, müssen Sie einen private Konstruktor verwenden. Zum Beispiel vor dem C# 2.0, die static Klassen eingeführt, verwendete man einen private Konstruktor ungefähr das Gleiche zu erreichen:

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

Während this link is related to java, ich denke, es sollten Sie den Grund verstehen helfen, warum, wie die Idee ist so ziemlich das gleiche.

Privatbauer verhindern eine Klasse von explizit von Anrufern instanziiert wird. Es gibt einige allgemeine Fälle, in denen ein privater Konstruktor nützlich sein kann:

  • Klassen nur statische Hilfsmethoden
  • Klassen enthalten, die nur Konstanten
  • Typ sicher Aufzählungen
  • Singletons
2

Zum Beispiel, wenn Sie Factory-Methoden zur Steuerung der Instanziierung bereitstellen ...

public class Test(){ 

    private Test(){ 
    } 

    void DoSomething(){ 
    // instance method 
    } 

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

Wenn Sie möchten, instanziiert die Klasse direkt die Benutzer Ihrer Klasse zu verhindern. Einige häufige Fälle sind:

  • Klassen, die nur statische Methoden
  • Singletons
7

kann ich einige Verwendungen für sie erinnern kann:

  • Sie es von einem statischen Factory-Methode verwenden könnte innerhalb der gleichen Klasse
  • Sie könnten einige gemeinsame Arbeit im Inneren tun und es dann rufen Sie aus anderen contructure
  • Sie es nutzen, um die Laufzeit von Hinzufügen eines leeren contructure automatisch
  • Es könnte verwendet werden (obwohl privat) von einigen spöttischen und ORM-Tools (wie nhibernate)
12

Wenn Sie einige Entwurfsmuster kennen, um zu verhindern Es ist offensichtlich: Eine Klasse könnte intern eine neue Instanz von sich selbst erstellen und andere nicht zulassen. Ein Beispiel in Java (ich weiß, C# gut genug, leider nicht) mit einer Singleton-Klasse:

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

Humorvoll genug, dieses Java ist auch gültig C# - vielleicht wissen Sie mehr C# als Sie denken. ;) –

1

Sie es mit Vererbung in einem Fall verwendet werden können, wo die Argumente an den Konstruktor für die Basisklasse sind andere Typen als die des untergeordneten Klassenkonstruktors, aber Sie benötigen weiterhin die Funktionalität der Basisklasse in der untergeordneten Klasse, z. geschützte Methoden.

Grundsätzlich sollte dies jedoch vermieden werden, da dies eine schlechte Form der Vererbung ist.

0

Und natürlich können Sie privaten Konstruktor verwenden, um Unterklassen zu verhindern.

2

Private Konstruktoren werden verwendet, um die Erstellung von Instanzen einer Klasse zu verhindern, wenn keine Instanzfelder oder Methoden vorhanden sind, z. B. die Math-Klasse oder eine Methode zum Abrufen einer Instanz einer Klasse aufgerufen wird. Wenn alle Methoden in der Klasse statisch sind, sollten Sie die gesamte Klasse statisch machen. Weitere Informationen finden Sie unter Statische Klassen und Statische Klassenmitglieder.

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

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

Das folgende Beispiel zeigt eine Klasse, die einen privaten Konstruktor verwendet.

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

Ich bin, um das Spiel zu spät, aber alle durch die anderen Antworten zu lesen, ich sehe nicht, diese Nutzung erwähnt:

ich in Szenarien private Konstruktoren verwenden, wo ich mehr (öffentlich) Konstruktoren und alle haben einen gemeinsamen Code. Bei der Konstruktorverkettung wird der Code wirklich ordentlich und DRY.

Denken Sie daran, die privaten readonly Variablen können nur in Konstruktoren gesetzt werden, so dass ich keine normale Methode verwenden kann.

Beispiel:

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

Grundsätzlich Sie private Konstruktoren verwenden, wenn Sie ein Singleton-Entwurfsmuster folgen. In diesem Fall haben Sie eine statische Methode innerhalb der Klasse definiert, die intern den privaten Konstruktor aufruft.

Um also die Instanz der Klasse zum ersten Mal zu erstellen, ruft der Benutzer den Klassennamen.static_method_name auf. Da bei dieser Methode das Objekt der Klasse noch nicht existiert, ruft die statische Methode intern den privaten Konstruktor auf und gibt die Instanz der Klasse zurück.

Wenn die Instanz der Klasse bereits vorhanden ist, gibt die statische Methode die Instanz einfach an die aufrufende Methode zurück.