2010-04-14 16 views
8

Ho sentito dire che un costruttore privato impedisce la creazione di oggetti dal mondo esterno.Costruttore privato e costruttore parametri pubblici

Quando ho un codice di

public class Product 
{ 
    public string Name { get;set;} 
    public double Price {get;set;} 
    Product() 
    { 
    } 

    public Product(string _name,double _price) 
    { 
    } 
} 

Qui riesco ancora a dichiarare un costruttore pubblico (parametro), non si rovinare lo scopo del costruttore privato? Quando abbiamo bisogno di un costruttore (parametro) privato e pubblico nel codice?

Ho bisogno di una spiegazione dettagliata per favore.

risposta

5

Il motivo per cui si utilizza lo schema che si sta descrivendo è quando si desidera controllare in modo da creare un'istanza dell'istanza.

Nel tuo esempio, ad esempio, stai dicendo che il modo solo per creare un prodotto è specificandone il nome e il prezzo. Questo è rispetto al mondo esterno, ovviamente. Si potrebbe anche fare qualcosa di simile usando altri modificatori di accesso, e avrebbe implicazioni diverse, ma tutto si riduce a controllare come si desidera che gli oggetti siano istanziati rispetto a chi lo farà.

Se si desidera evitare del tutto la creazione dell'oggetto, è necessario rendere privati ​​(o protetti) tutti i costruttori. Ciò costringerebbe l'oggetto a essere creato da se stesso (o da una classe ereditata).

Inoltre, come Matti ha sottolineato nel commento seguente, quando si definisce un costruttore parametrizzato non è necessario specificare un costruttore predefinito privato. A quel punto è implicito.

+4

Definire un costruttore con parametri disattiva automaticamente la creazione del costruttore senza parametri di default, quindi in questo caso a parte dichiarando non è necessario il privato costruttore senza parametri. –

0

Si utilizzerà un costruttore con parametri quando si desidera forzare il codice chiamante a passare un valore al costruttore per creare un'istanza della classe. Nell'esempio, il codice chiamante deve utilizzare la versione del parametro del costruttore per creare uno Product.

2

È necessario un costruttore privato quando si desidera che quel costruttore sia chiamato all'interno della classe stessa. Nel tuo esempio stai costringendo l'oggetto chiamante a fornire 2 parametri durante la creazione dell'oggetto.

Con un costruttore privato si potrebbe fare qualcosa di simile:

public static GetInstance() 
{ 
    return new YourObject(); 
} 

ma nient'altro che l'oggetto potrebbe chiamare il costruttore senza parametri.

E 'comunemente usato per creare un pattern Singleton:

http://www.dofactory.com/Patterns/PatternSingleton.aspx

4

Costruttori possono essere concatenati insieme, per evitare di dover duplicare il codice, quindi è abbastanza comune avere i costruttori privati ​​che nessuno dovrebbe chiamare al di fuori della classe, ma a cui ogni costruttore pubblico si limita quindi a eseguire le catene.

Esempio:

public class Test 
{ 
    private Test(int? a,string b) { } 
    public Test(int a) : this(a, null) { } 
    public Test(string b) : this(null, b) { } 
} 

Qui ci sono due costruttori pubblici, uno prendendo una stringa, e una famiglia tenendo un int, ed entrambi catena al costruttore privato comune che prende entrambi gli argomenti.

Inoltre, naturalmente, è possibile costruisce nuovi oggetti dall'interno della stessa classe utilizzando il costruttore privato, per esempio, si potrebbe desiderare costruttori specializzati disponibili solo attraverso metodi factory statici:

public static Test Create() 
{ 
    int? a = ReadConfigurationForA(); 
    string b = ReadConfigurationForB(); 
    return new Test(a, b); 
} 

Qui non potrebbe essere una buona idea per esporre il costruttore privato al mondo esterno, ma piuttosto aggiungere un metodo factory statico che recuperi gli argomenti corretti per passare il costruttore.

0

Un costruttore privato è un costruttore di istanze speciali. È comunemente usato in classi che contengono solo membri statici. Se una classe ha uno o più costruttori privati ​​e nessun costruttore pubblico, allora le altre classi (tranne le classi nidificate) non possono creare istanze di questa classe.

Per maggiori dettagli si riferiscono a questo: http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx

Problemi correlati