2012-06-30 20 views
24

È possibile sovrascrivere il costruttore della classe base nella classe derivata?È possibile sovrascrivere un costruttore in C#?

Se è così, come può essere realizzato e in quale caso pratico sarebbe pratico? Se no, perché no?

+1

La cara codifica di esperti deriva dalla logica sto solo chiedendo la risposta – naval

+4

Altri hanno risposto bene. Nel caso in cui non si conosca la sintassi dei costruttori "chainig", è così: 'Internal MyClass (nome stringa): base (null, 0, name) {...}'. In questo esempio, il costruttore chiama un costruttore di base con tre parametri. –

+0

Riaprire gli elettori: per favore [modifica] la domanda ai normali standard prima di votare per riaprire. –

risposta

43

No, non è possibile sovrascrivere i costruttori. Il concetto non ha senso in C#, perché i costruttori semplicemente non sono invocati polimorficamente. Si indica sempre quale classe si sta tentando di costruire e gli argomenti per il costruttore.

I costruttori non sono affatto ereditati, ma tutti i costruttori di una classe derivata devono concatenarsi a un altro costruttore della stessa classe oa uno dei costruttori nella classe base. Se non lo fai esplicitamente, il compilatore si impegna implicitamente nel costruttore senza parametri della classe base (e si verifica un errore se tale funzione di costruzione non esiste o è inaccessibile).

+4

"Il concetto non ha senso, in realtà - i costruttori semplicemente non sono invocati in modo polimorfico." - a Delphi, lo sono. È una funzionalità molto utile e trovo i rimedi necessari in C#, usando il reflection e passando per le istanze 'Type' controllate da runtime, o fornendo classi factory separate, piuttosto ingombranti in confronto. –

+3

@ O.R.Mapper: Sì, stavo parlando nel contesto di C#. Ciò che altri linguaggi fanno è irrilevante a questa risposta. –

+3

In questo caso, suggerisco che la risposta non rechi "il concetto non ha senso, in realtà", dato che suona piuttosto generale. Qualcosa del tipo "Il concetto avrebbe molto senso, ma non è possibile utilizzare il concetto in C#, poiché i costruttori non sono invocati in modo polimorfico". potrebbe essere più chiaro. –

10

No, i costruttori non sono ereditati. Non è possibile sovrascriverli nella classe derivata.
Motivo

Un costruttore di base sarà sempre chiamato, per ogni classe che scende da oggetto, perché ogni classe deve avere almeno un costruttore che chiama un costruttore di base() (esplicitamente o implicitamente) e ogni chiamata a un costruttore this() deve alla fine chiamare un costruttore di base().

+0

Upvoted per una spiegazione pertinente e buona !! – KillABug

6

No, non è possibile sovrascrivere il costruttore.

Se si dà un'occhiata alla sintassi di base di un costruttore, dovrebbe avere lo stesso nome della classe per cui si sta scrivendo.

Diciamo, si scrive un metodo con lo stesso nome di quello della classe base (uguale a quello del costruttore della classe base), sarà solo un nuovo metodo nella classe derivata senza tipo di ritorno specificato, che è sintatticamente errato.

+0

In aumento per una spiegazione semplice. !! – KillABug

Problemi correlati