2012-07-26 21 views
6

Voglio sapere perché una classe Singleton dovrebbe essere sigillata. Se stiamo dando il costruttore come privato possiamo impedire che la classe sia derivata giusta? .. Di seguito sto incollando poche righe da MSDN. Per favore datemi un po 'di colore ..Perché la classe Singleton dovrebbe essere sigillata?

In questa strategia, l'istanza viene creata la prima volta che viene fatto riferimento a qualsiasi membro della classe. Il Common Language Runtime si occupa dell'inizializzazione della variabile. La classe è contrassegnata come sigillata per impedire la derivazione, che potrebbe aggiungere istanze. Per una discussione sui pro e contro di contrassegnare una classe sigillata, vedi [Sells03]. Inoltre, la variabile è contrassegnata in sola lettura, il che significa che può essere assegnata solo durante l'inizializzazione statica (che viene mostrata qui) o in un costruttore di classi.

http://msdn.microsoft.com/en-us/library/ff650316.aspx

risposta

0

Questa è una sorta di linee guida di progettazione che, ovviamente, si possono seguire o meno. Questo è solo segnare le tue intenzioni progettuali come nel caso di una classe base che lo contrassegna come abstract per evitare possibili problemi in futuro.

2

La parola chiave sealed indica che la classe non può essere ereditata da. La dichiarazione privata dei costruttori indica che non è possibile creare istanze della classe.

Queste non sono la stessa cosa. È possibile avere una classe base con un costruttore privato, ma ereditare comunque da quella classe base, definire alcuni costruttori pubblici e creare un'istanza efficace di tale classe base.

Ricordare che i costruttori non sono ereditati (quindi la classe derivata non avrà tutti i costruttori privati ​​solo perché la classe base fa) e che le classi derivate chiamano sempre prima i costruttori della classe base. Contrassegnare la classe sealed impedisce a qualcuno di aggirarsi banalmente attorno alla classe singleton costruita con cura perché impedisce a qualcuno di ereditare dalla classe.

+0

È possibile derivare solo dalla classe base * se la classe derivata ha accesso al costruttore privato *. Vedi la mia risposta per l'unico modo in cui ciò è fattibile. –

+0

Tuttavia io non sono in grado di costruire le BaseClass classe seguente codice { BaseClass private() { }} classe Derrived: BaseClass { pubblica display void() { Console.WriteLine ("In Derrived class"); } } e sto ricevendo errore come BaseClass.BaseClass() 'è inaccessibile a causa del suo livello di protezione – Anish

10

Se forniamo il costruttore come privato, possiamo impedire che la classe venga derivata correttamente?

Non abbastanza:

public class NotReallySingleton 
{ 
    private NotReallySingleton() {} 

    public class CursesFoiledAgain : NotReallySingleton 
    { 
    } 
} 

... 

NotReallySingleton x = new CursesFoiledAgain(); 
NotReallySingleton y = new CursesFoiledAgain(); 

Questo funziona perché private accesso è limitato al testo programma di del tipo, compresi i tipi nidificati. Quindi CursesFoiledAgain ha accesso al costruttore privato di NotReallySingleton.

Ma anche lasciando da parte questo, se la vostra intenzione è che nessuno può derivare dalla classe, Perché non si vuole segnalare che l'intenzione il più chiaramente possibile, via sealed?

+0

Perdona la mia mancanza di conoscenza C#, ma non 'CursesFoiledAgain' è necessario estendere' NotReallySingleton', o è implicito essendo un tipo annidato a differenza di Java? –

+0

@DavidHarkness: Mi spiace, no - era un refuso. Deve essere fatto esplicitamente, che aggiusterò ora :) –

Problemi correlati