2009-04-17 10 views

risposta

62

Semplicemente perché essere pubblici non ha senso in una classe astratta. Una classe astratta per definizione non può essere istanziata direttamente. Può essere istanziato solo da un'istanza di un tipo derivato. Pertanto gli unici tipi che dovrebbero avere accesso a un costruttore sono i suoi tipi derivati ​​e quindi protetti ha molto più senso del pubblico. Descrive più accuratamente l'accessibilità.

+8

In altre parole: perché vuoi inquinare l'IntelliSense di altre persone con spazzatura inutile? –

+3

I costruttori di Andrea si visualizzano solo in intellisense per le chiamate nuove e di base. Classicamente le classi astratte vengono filtrate da nuove prima che l'accessibilità venga presa in considerazione perché il controllo dell'estrazione è molto semplice ed economico. – JaredPar

+5

Detto questo, il compilatore non dovrebbe imporre che le classi astratte ** non possano ** avere costruttori 'public'? – Yuck

1

È buona pratica OO.

public abstract class ExampleAbstractClass 
{ 
    protected ExampleAbstractClass() 
    { 
     // ::: 
    } 
} 

Si desidera solo che le classi figlio ereditanti abbiano accesso al costruttore. L'unico modo per farlo è proteggere il costruttore.
Ricordare che quando si aggiungono parametri a questi costruttori, si tratta di una discussione completamente diversa.

+2

Cosa lo rende diverso quando aggiungi i parametri? Il costruttore sarà ancora chiamato solo per classi derivate. –

+0

Forza tutti i costruttori dell'eritor di avere il parametro nella loro firma, se necessario o no. –

+1

@SrikarDoddi: No, non è così. I costruttori ereditati devono semplicemente chiamare ': base (...)' e passare qualcosa, ma quel qualcosa può anche essere costanti o valori recuperati da altrove. –

12

Tecnicamente non fa alcuna differenza se si crea il costruttore public invece di protected in una classe astratta. L'accessibilità/visibilità del costruttore è ancora esattamente la stessa: la stessa classe o classi derivate. Le due parole chiave hanno effetti indistinguibili a tutti gli effetti.

Quindi, questa scelta è solo una questione di stile: digitare protected per soddisfare le persone esperte orientate agli oggetti.


Riflessione per impostazione predefinita includere solo il costruttore quando è public, ma non si può chiamare quel costruttore in ogni caso.

IntelliSense mostrerà il costruttore public quando si digita new, ma non è comunque possibile chiamare tale costruttore.

I metadati dell'assieme riflettono il fatto che il costruttore è pubblico o protetto.

+0

Tranne che affermare la visibilità come "pubblico" non è veritiero. –

+1

La sua risposta dà le differenze funzionali tra i due che è esattamente quello che stavo cercando. Che sia sincero, non importa, e inoltre è un problema per il linguaggio C# da affrontare, non dagli sviluppatori. – aaaaaa

Problemi correlati