La réponse d'Igor est un bel exemple de la façon dont vous devriez écrire les constructeurs dans cette situation. Pour traiter le cas plus général de votre phrase finale: vous ne pouvez pas enchaîner à plus d'un constructeur. Vous ne pouvez pas appeler un constructeur de base et un autre constructeur de la classe en cours.
Il existe deux modèles typiques pour les constructeurs surchargés. Dans le premier modèle, l'ensemble des surcharges de la classe dérivée correspond à peu près à l'ensemble des surcharges de la classe de base - vous essayez de faire croire à la classe dérivée qu'elle a hérité des constructeurs, effectivement. (Les constructeurs eux-mêmes ne sont pas hérités, mais si vous fournissez les mêmes signatures, cela ressemble à l'appelant.) C'est généralement le cas lorsque votre classe dérivée n'a pas besoin d'informations supplémentaires. Bien sûr, chaque constructeur peut avoir des paramètres supplémentaires, et seulement transmettre un sous-ensemble au constructeur de base, mais cela peut commencer à se compliquer. Dans le deuxième modèle, vous avez plusieurs constructeurs dans la classe dérivée, chacun appelant un constructeur "maître" dans la même classe (dérivée). Ce constructeur maître a le plus de paramètres, car il doit être capable de gérer tout spécifié par l'un des autres constructeurs. Parfois, le constructeur principal doit être privé, si certaines combinaisons n'ont pas de sens, mais sont pratiques à spécifier dans un endroit où vous savez que vous ne pouvez atteindre le code via un constructeur public sensible. Dans ce cas, seulement ce constructeur "maître" enchaîne directement au constructeur de la classe de base. Ceci est généralement utilisé lorsque la classe dérivée a plusieurs informations supplémentaires au-delà de ce dont la classe de base a besoin.
Il y a des hybrides de ce modèle où vous avez plusieurs maîtres avec des "groupes" de surcharges qui appellent les maîtres ... mais je vous conseille d'essayer de rester simple quand c'est possible. Pensez également à la possibilité de fournir des méthodes statiques en lieu et place de constructeurs - ce qui peut rendre le code plus lisible car vous pouvez nommer les méthodes par leur fonction/leurs paramètres - voir TimeSpan.FromMinutes
par exemple.
Le seul problème possible que je peux voir ici serait si ** vous ne vouliez pas ** Class2 (int a): base (a) ', mais ** did ** want' Class2(): base (2) '. Cependant, je ne peux pas penser à une structure de classe où une telle décision serait la meilleure conception. –
que je connais, mais je veux exécuter deux d'entre eux dans le constructeur par défaut de la classe dérivée que je veux exécuter le constructeur paramétré de base ainsi que de dérivé par le constructeur par défaut de la classe dérivée (peut écrire quelque part dans la définition) – Nits
, vous ne pouvez pas faire cela, vous pouvez seulement appeler * un autre constructeur *, pas les deux. Je pense que vous devriez repenser le design qui nécessite que les constructeurs soient appelés de cette manière. –