2010-07-13 14 views
7

Mi chiedo sempre se è possibile avere una classe privata privata? E quale sarebbe il punto di avere una tale classe?È possibile avere una classe privata?

Grazie per l'aiuto.

+0

possibile duplicato di [Perché/quando si dovrebbero usare classi annidate in .net? O non dovresti?] (Http://stackoverflow.com/questions/48872/why-when-should-you-use-nested-classes-in-net-or-shouldnt-you) – nawfal

risposta

19

Sì, è possibile avere una classe privata, ma solo come una classe interna di un'altra classe:

public class Outer 
{ 
    private class Inner 
    {} 
} 

Questo di solito è utile quando si desidera incapsulare una logica all'interno di una classe (quella esterna), ma hanno bisogno di un design più strutturato/OO del codice per implementarlo. Ho usato questo modello in passato quando ho bisogno di una classe contenitore per elaborare alcune informazioni all'interno di un metodo di una classe, ma la classe contenitore non ha significato al di fuori di questa logica. Rendere la classe del contenitore una classe interna privata significa che il suo uso è localizzato alla classe esterna che lo utilizza.

Vale la pena notare che con questa struttura, la classe interna ha accesso ai membri privati ​​della classe esterna, ma non viceversa.

+0

Puoi usare questo con il pattern NullObject (http://en.wikipedia.org/wiki/Null_Object_pattern) e quindi le tue classi client non sapranno mai che c'è un'altra classe di cui preoccuparsi. –

2

Sì, è possibile - in genere sono classi annidate all'interno di un altro tipo. Ciò significa che è possibile aggregare la logica in una classe nidificata senza esporre la classe a qualcos'altro. Anche l'interno è utile per le classi annidate.

Nota comunque che ci sono alcuni argomenti contro un progetto che richiede classi nidificate - Io tendo ad usarli quando sembrano comunque adatti.

2

È possibile avere una classe privata, all'interno di un'altra classe.

È possibile utilizzare una classe privata per incapsulare la logica e l'implementazione. Ad esempio, è possibile dichiarare un'implementazione di un iteratore nella propria implementazione di ICollection.

3

Avere classi private non nidificate (Visibile solo al loro spazio dei nomi e ai soli spazi dei nomi figlio) consentirebbe di pulire i limiti del codice durante la programmazione nello stesso assieme.

Avendo ad esempio solo un'interfaccia e una fabbrica visibili da altri spazi dei nomi nello stesso assieme pur avendo tutta l'implementazione dell'interfaccia e delle classi di utilità (che nessuno ha business sapendo fuori dallo spazio dei nomi) lì.

È ancora possibile farlo in qualche modo con una grande classe parziale che sostituisce uno spazio dei nomi e classi nidificate all'interno, ma è un brutto attacco e il test delle unità diventa quasi impossibile.

+0

+1 per il commento dello spazio dei nomi. –

+0

Questa risposta contraddice le prime due righe: http://stackoverflow.com/a/6776502/733152, puoi cancellare la confusione? Grazie, –

+0

@ Mr.Anubis Leggi la domanda per favore. Stavo rispondendo al secondo punto su quale sarebbe l'utilità delle classi private se esistessero in particolare, se fossero private dei nomi. Siccome il "dovrebbe" nella mia prima linea esprimere questa caratteristica non è nell'attuale specifica C#. –

Problemi correlati