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?
risposta
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.
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
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
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. –
Cos'è l'abstract sealed? Qualcuno può spiegare di cosa si tratta? – kakkarot
bello menzionarlo ma il sigillo astratto non è possibile. –
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)
cosa vuoi fare con la classe? – Jay
Risposta = Classe statica – MajkeloDev
Classe astratta, classe statica non possono essere istanziati – Dragon