2009-11-05 4 views
25

Se un costruttore pubblico in una classe astratta può essere chiamato solo dalle loro classi derivate, dovrebbe essere funzionalmente equivalente a un costruttore protetto. Destra?Qual'è l'utilità dei costruttori pubblici nelle classi astratte in C#?

C'è qualche differenza nel dichiarare un costruttore pubblico, anziché uno protetto, in una classe astratta? Per cosa lo useresti? Perché il compilatore non reclama?

Grazie

risposta

21

Assolutamente corretto. Dovresti favorire il costruttore protetto.

MODIFICA: no il compilatore non si lamenta, ma strumenti come FxCop (& Analisi del codice) fare. Credo che ci siano alcuni strani trucchi di riflessione che puoi fare con i costruttori pubblici in classi astratte, ma da un punto di vista in cui stai semplicemente fornendo funzionalità di classe base ad altri sviluppatori che scrivono sottoclassi, segui il costruttore protetto.

+0

concordato. Questo sta avendo più dettagliato: http://stackoverflow.com/questions/2700256/why-cant-create-object-of-an-abstract-class –

2

Sì, hai ragione, in pratica il costruttore pubblico non ha alcun uso in classe abscract poichè non puoi crearli.

Tuttavia il compilatore non si lamenterà perché in questo modo ci sono così tante cose inutili che puoi scrivere nel contesto di C#, ma non sarà in grado di controllarne il significato logico, può solo controllare le regole di analisi che è impostato per .

E sicuramente i creatori di C# si sono concentrati sulla creazione di regole di compilazione (regole) che sono effettivamente dannose e che violano l'uso della lingua.

4

Sei corretto. Un costruttore pubblico in una classe astratta è funzionalmente equivalente a un costruttore protetto.

Preferisco utilizzare un costruttore protetto in questo caso.

Mentre è vero che il compilatore non si lamenterà di ciò, il compilatore si lamenterà del tentativo di generare un'istanza della classe astratta. Visual Studio è anche abbastanza intelligente da non fornire Intellisense se si tenta di creare un'istanza della classe astratta.

+0

Ci sono alcuni casi limite con riflessione che possono essere semplificati facendo costruttori di classi astratte pubblico ... ma sono eccezionalmente rari. Sono generalmente d'accordo che i costruttori in classi astratte dovrebbero essere protetti (o privati ​​se sono invocati da altri sovraccarichi del costruttore). – LBushkin