C # – Tutte le classi derivate chiamano il costruttore della class base

Ho un personaggio di class base che ha diverse classi derivate da esso. La class base ha vari campi e metodi.

Tutte le mie classi derivate usano lo stesso costruttore della class base, ma se non ridefinisco il costruttore nelle mie classi derivate ottengo l’errore:

Errore: la class “class figlio” non contiene un costruttore che accetta questo numero di argomenti

Non voglio ridefinire il costruttore in ogni class derivata perché se il costruttore cambia, devo cambiarlo in ogni singola class che, perdonando ogni malinteso, va contro l’idea di scrivere solo codice una volta sola?

Devi ridichiarare i costruttori, perché non sono effettivamente ereditati. Ha senso se pensi che i costruttori siano un po ‘come i metodi statici per certi aspetti.

In particolare, non si vorrebbe che tutti i costruttori siano automaticamente ereditati – dopotutto, ciò significherebbe che ogni class avrebbe un costruttore senza parametri, come fa l’ object stesso.

Se si desidera chiamare semplicemente il costruttore della class base, non è necessario scrivere alcun codice nel corpo del costruttore, ma solo passare gli argomenti alla class base come per il post di Waleed.

Se la tua class base inizia a richiedere più informazioni, è naturale che tu debba dover cambiare tutte le classi derivate – e in effetti qualsiasi cosa chiama i costruttori di quelle classi – perché devono fornire le informazioni. So che può sembrare un dolore, ma è solo una conseguenza naturale di ciò che fanno i costruttori.

È ansible utilizzare la seguente syntax per chiamare il costruttore della class base dalle classi che ne derivano:

 public DerivedClass() : base() { // Do additional work here otherwise you can leave it empty } 

Questo chiamerà prima il costruttore di base, quindi eseguirà eventuali istruzioni aggiuntive, se ve ne sono, in questo costruttore derivato.

Nota che se il costruttore base prende argomenti puoi farlo:

 public DerivedClass(int parameter1, string parameter2) : base(parameter1, parameter2) { // DerivedClass parameter types have to match base class types // Do additional work here otherwise you can leave it empty } 

Puoi trovare ulteriori informazioni sui costruttori nella pagina seguente:

http://msdn.microsoft.com/en-us/library/ms173115%28VS.80%29.aspx

Ho avuto lo stesso problema e l’ho risolto sostituendo il mio costruttore con un metodo factory come questo:

A è la class genitore.

 public static T getChild(int number) where T:A, new() { T child = new T(); T._number = number; return child; } 

È ansible creare una class figlio con

Child b = A.getChild(2);

Una sorta di alternativa potrebbe essere quella di affidarsi a un contenitore di Dependency Injection per inizializzare gli oggetti, in questo modo il riferimento alla class base (potrebbe essere la chiamata al costruttore di base o un altro metodo di inizializzazione) sarebbe “esternalizzato” al contenitore DI.

Non so se ha senso per il tuo caso o no