2009-05-28 43 views

Respuesta

31

Por ejemplo, si tiene una clase que sólo debe ser creado a través de métodos de fábrica. O si tiene sobrecargas del constructor, y algunos de ellos solo deberían ser utilizados por los otros constructores. Probablemente otras razones también =)

+2

En realidad, cuando tiene que controlar la creación de instancias de clases, eso podría ser a través de un patrón de fábrica o un patrón singleton. –

+0

@ André: ¿Y tu punto es? Eso seguiría siendo una razón para tener constructores privados. A menos que su clase de fábrica sea una clase diferente, pero ese es un tema diferente. – Svish

11

Cuando desee evitar la creación de instancias directas de una clase desde fuera de ella, usará un constructor private. Por ejemplo, antes de C# 2.0, que introdujo static clases, que utilizó un constructor private para llevar a cabo más o menos lo mismo:

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

Mientras que this link is related to java, creo que debería ayudarlo a entender la razón por la cual la idea es más o menos la misma.

Los constructores privados evitan que los llamadores creen una instancia explícita de una clase. Hay algunos casos comunes donde un constructor privado puede ser útil:

  • clases que contienen sólo métodos de utilidad estáticas
  • clases que contienen únicas constantes
  • tipo enumeraciones seguras
  • singletons
2

Por ejemplo, cuando proporciona métodos de fábrica para controlar la instanciación ...

public class Test(){ 

    private Test(){ 
    } 

    void DoSomething(){ 
    // instance method 
    } 

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

Cuando desee evitar que los usuarios de su clase creen una instancia de la clase directamente. Algunos casos más comunes son:

  • clases que contienen sólo métodos estáticos
  • Singleton
7

puedo puedo recordar algunos usos para ello:

  • se podría utilizar a partir de un método de fábrica estática dentro de la misma clase
  • Podría hacer un trabajo común dentro de él y luego llamarlo desde otra contrucción
  • Usted puede usarlo para evitar que el tiempo de ejecución de la adición de un contructure vacía automáticamente
  • Podría ser utilizado (aunque privada) de algunas herramientas burlones y ORM (como nhibernate)
12

Si conoces algún patrón de diseño, es obvio: una clase podría crear una nueva instancia de sí mismo internamente, y no dejar que otros lo hagan. Un ejemplo en Java (no sé C# lo suficientemente bien, lo siento) con una clase Singleton:

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

Curiosamente, esta Java también es válida C# - tal vez conozca más C# de lo que cree. ;) –

1

Usted puede utilizarlo con herencia en un caso en que los argumentos para el constructor de la clase base son de diferentes tipos a los del constructor de clases hijo, pero aún necesita la funcionalidad de la clase base en la clase secundaria, por ejemplo. métodos protegidos

En general, esto debe evitarse siempre que sea posible, ya que esta es una mala forma de herencia que se debe utilizar.

0

Y, por supuesto, puede usar el constructor privado para evitar la creación de subclases.

2

Los constructores privados se utilizan para evitar la creación de instancias de una clase cuando no hay campos o métodos de instancia, como la clase Math o cuando se llama a un método para obtener una instancia de una clase. Si todos los métodos de la clase son estáticos, considere la posibilidad de que toda la clase estética. Para obtener más información, consulte Clases estáticas y Miembros estáticos de la clase.

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

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

El siguiente es un ejemplo de una clase que utiliza un constructor privado.

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

llego tarde al juego, pero la lectura a través de todas las otras respuestas, no veo este uso mencionó:

utilizo constructores privados en escenarios en los que tengo varios constructores (públicos) , y todos ellos tienen algún código en común. Con el encadenamiento de constructores, el código se vuelve realmente limpio y SECO.

Recuerde, las variables de solo lectura privadas solo se pueden establecer en constructores, por lo que no puedo usar un método regular.

Ejemplo:

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

Básicamente se utilizan constructores privados cuando se está siguiendo un patrón de diseño Singleton. En este caso, tiene un método estático definido dentro de la clase que internamente llama al constructor privado.

Por lo tanto, para crear la instancia de la clase por primera vez, el usuario llama a classname.static_method_name. En este método, dado que el objeto de la clase aún no existe, el método estático llama internamente al constructor privado y devuelve la instancia de la clase.

Si la instancia de la clase ya existe, el método estático simplemente devuelve la instancia al método de llamada.

Cuestiones relacionadas