C # – Appel de la classe de base à toutes les classes dérivées

J’ai une classe de base Character qui a plusieurs classes qui en dérivent. La classe de base a divers champs et méthodes.

Toutes mes classes dérivées utilisent le même constructeur de classe de base, mais si je ne redéfinis pas le constructeur dans mes classes dérivées, l’erreur suivante apparaît:

Erreur: La classe “classe enfant” ne contient pas de constructeur qui prend ce nombre d’arguments

Je ne veux pas redéfinir le constructeur dans chaque classe dérivée parce que si le constructeur change, je dois le changer dans chaque classe unique, ce qui, pour éviter tout malentendu, va à l’encontre de l’idée d’écrire du code une seule fois?

Vous devez redéclarer les constructeurs, car ils ne sont en réalité pas hérités. Il est logique de penser que les constructeurs sont un peu comme des méthodes statiques à certains égards.

En particulier, vous ne voudriez pas que tous les constructeurs soient automatiquement hérités – après tout, cela voudrait dire que chaque classe aurait un constructeur sans paramètre, comme le fait l’ object lui-même.

Si vous souhaitez simplement appeler le constructeur de la classe de base, vous n’avez pas besoin d’écrire de code dans le corps du constructeur. Il vous suffit de transmettre les arguments à la classe de base conformément à la publication de Waleed.

Si votre classe de base commence à demander plus d’informations, il est naturel que vous deviez modifier toutes les classes dérivées (et même tout ce qui appelle les constructeurs de ces classes), car elles doivent fournir les informations. Je sais que cela peut sembler être une douleur, mais c’est simplement une conséquence naturelle de ce que font les constructeurs.

Vous pouvez utiliser la syntaxe suivante pour appeler le constructeur de la classe de base à partir des classes qui en dérivent:

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

Cela appellera d’abord le constructeur de base, puis il exécutera toutes les instructions supplémentaires éventuelles dans ce constructeur dérivé.

Notez que si le constructeur de base prend des arguments, vous pouvez le faire:

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

Vous trouverez plus d’informations sur les constructeurs dans la page suivante:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-constructors

Dans une classe dérivée, si un constructeur de classe de base n’est pas appelé explicitement à l’aide du mot clé base , le constructeur par défaut, s’il en existe un, est appelé de manière implicite.

J’ai eu le même problème et je l’ai résolu en remplaçant mon constructeur par une méthode d’usine comme celle-ci:

A est la classe parente.

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

Vous pouvez créer une classe enfant avec

Child b = A.getChild(2);

Une alternative pourrait consister à utiliser un conteneur Dependency Injection pour initialiser vos objects. Ainsi, la référence à la classe de base (appel au constructeur de base ou à une autre méthode d’initialisation) serait “externalisée” vers le conteneur DI.

Je ne sais pas si cela a du sens pour votre cas ou non