2015-10-08 8 views
5

Quali sono i modi per creare una classe non istantanea? Un modo è dichiarandolo come una classe astratta. È possibile farlo rendendo il costruttore della classe privato? È una classe sigillata, non istantanea? E ci sono altri modi per farlo in C#?Quali sono i modi per dichiarare una classe che non può essere istanziata?

+1

cosa vuoi fare con la classe? – Jay

+0

Risposta = Classe statica – MajkeloDev

+0

Classe astratta, classe statica non possono essere istanziati – Dragon

risposta

7

Contrassegnare una classe come astratta o statica (si escludono a vicenda) sono gli unici due modi. Contrassegnare tutti i costruttori come privati ​​non rende la classe non è realizzabile poiché la classe può ancora costruirsi da sé, e altri potrebbero essere in grado di farlo attraverso la riflessione.

+0

È una classe sigillata, non istantanea? – kakkarot

+0

La classe sealed @madmax non è ereditabile. –

+0

No, una classe sigillata non può essere ereditata. Non dice nulla sulla riproducibilità immediata – kai

1

Come risposta da altre classi astratte e statiche non possono essere istanziate tuttavia una classe con costruttore privato può essere utilizzando una funzione membro pubblico. Questo è il modo in cui il modello singleton funziona

2

Solo static sembra una soluzione completa qui perché la classe abstract può ancora essere istanziata quando l'istanza di classe che ne eredita viene istanziata. Si consideri lo scenario:

abstract class A { } 

class B : A { } 

somewhere in code : 

B instance = new B(); // this creates instance of class A as well 

P.S. In un primo momento però che potrebbe essere abstract sealed soluzione per questo problema pure ma non ha molto senso usare una tale costruzione quindi neppure non compila:

Error 1 'A': an abstract class cannot be sealed or static D:\Projects\TEST\Testapp\Program.cs 15 27 ITT.Domain 
+0

Sono d'accordo. In .Net è possibile ottenere un'istanza Stream. Ovviamente quella sarà sempre un'istanza di una sottoclasse di Stream. Ma per il codice sia all'interno della classe Stream che all'esterno della classe Stream, l'istanza è ancora un'istanza. –

+0

Cos'è l'abstract sealed? Qualcuno può spiegare di cosa si tratta? – kakkarot

+0

bello menzionarlo ma il sigillo astratto non è possibile. –

0

classi interne sono visibili solo all'interno del tuo assieme e quindi non può essere istanziato al di fuori di questo assembly.

Ma per quanto ne so, è comunque possibile creare un'istanza tramite riflessione. è possibile disabilitare riflessione tramite ReflectionPermission Class

Come accennato in precedenza si poteva dichiararlo come astratto o aggiungere un metodo astratto.

Se si desidera dichiarare un contratto, è possibile utilizzare un'interfaccia, ma questa non è affatto una classe.

sigillato significa che non è possibile ereditare questa classe

Singleton classi possono essere create solo una volta per ogni applicazione singleton

vedere sealed (C# reference)

Problemi correlati