187 votes

Comment hériter des constructeurs?

Imaginez une classe de base avec de nombreux constructeurs et une méthode virtuelle

public class Foo
{
   ...
   public Foo() {...}
   public Foo(int i) {...}
   ...
   public virtual void SomethingElse() {...}
   ...
}

et maintenant, je veux créer une classe descendante qui remplace la méthode virtuelle:

public class Bar : Foo 
{
   public override void SomethingElse() {...}
}

Et un autre descendant qui fait un peu plus de choses:

public class Bah : Bar
{
   public void DoMoreStuff() {...}
}

Dois-je vraiment copier tous les constructeurs de Foo dans un Bar et Bah? Et puis si je change une signature du constructeur Foo, dois-je le mettre à jour dans un Bar et Bah?

Il n'y a pas moyen d'accéder à des constructeurs? Il n'y a pas moyen d'encourager la réutilisation du code?

126voto

Jeff Yates Points 36725

Oui, vous aurez à mettre en œuvre les constructeurs qui ont du sens pour chaque dérivation et ensuite utiliser l' base mot-clé à ordonner que le constructeur de la classe de base appropriée ou l' this mot-clé pour diriger un constructeur à un autre constructeur de la même classe.

Si le compilateur fait des hypothèses sur les hériter des constructeurs, nous ne serions pas en mesure de déterminer comment nos objets ont été instancié. Dans la plupart des cas, vous devriez envisager de pourquoi vous avez tant de constructeurs et d'envisager de réduire à un seul ou deux dans la classe de base. Les classes dérivées peuvent ensuite masquer certains d'entre eux à l'aide des valeurs de constantes comme null et seulement exposer nécessaires, grâce à leurs constructeurs.

Mise à jour

En C#4 vous pouvez spécifier les valeurs de paramètre par défaut et utiliser des paramètres nommés pour en faire un seul constructeur en charge plusieurs argument configurations plutôt que d'avoir un constructeur par configuration.

69voto

Kon Points 16125

387 constructeurs ?? C'est votre problème principal. Et à propos de ça?

 public Foo(params int[] list) {...}
 

42voto

James Curran Points 55356

Oui, vous devez copier tous les constructeurs 387. Vous pouvez les réutiliser en les redirigeant:

   public Bar(int i): base(i) {}
  public Bar(int i, int j) : base(i, j) {}
 

mais c'est le mieux que tu puisses faire.

27voto

dviljoen Points 941

N’oubliez pas que vous pouvez aussi rediriger des constructeurs aux autres constructeurs au même niveau d’héritage :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X