web-dev-qa-db-fra.com

Héritage C # et constructeurs par défaut

Supposons qu'il existe une classe de base A et une classe B dérivée de A. Ensuite, nous savons que le constructeur de la classe A n'est jamais hérité par la classe B. Cependant, lorsqu'un nouvel objet de B est créé, alors - le constructeur par défaut de la classe A est appelé avant que le constructeur par défaut/personnalisé de la classe B soit appelé. Le but de ceci est peut-être que les champs de la classe A doivent être initialisés aux valeurs par défaut.

Supposons maintenant que la classe A ait défini un constructeur personnalisé. Cela signifie que le constructeur par défaut de la classe A est supprimé silencieusement par le compilateur. Maintenant, lors de la création d'une nouvelle instance de la classe B, quel constructeur de la classe A est automatiquement appelé avant d'invoquer le constructeur de la classe B? (Comment les champs class A sont-ils initialisés dans un tel cas?)

41
helloworld

Maintenant, lors de la création d'une nouvelle instance de la classe B, quel constructeur de la classe A est appelé automatiquement avant d'appeler le constructeur de la classe B?

Le code ne parviendra pas à compiler, en gros. Chaque constructeur doit se connecter à un autre constructeur, implicitement ou explicitement. Le constructeur qu'il enchaîne peut être dans la même classe (avec this) ou la classe de base (avec base).

Un constructeur comme celui-ci:

public B() {}

est implicitement:

public B() : base() {}

... et si vous ne spécifiez pas du tout un constructeur, il sera implicitement ajouté de la même manière - mais il doit toujours avoir quelque chose à appeler. Ainsi, par exemple, votre scénario:

public class A
{
    public A(int x) {}
}

public class B : A {}

conduit à une erreur de compilation de:

erreur CS7036: aucun argument donné ne correspond au paramètre formel requis 'x' de 'A.A(int)'

Cependant, vous pouvez spécifier explicitement un appel de constructeur différent, par exemple.

public B() : base(10) {} // Chain to base class constructor

ou

public B() : this(10) {} // Chain to same class constructor, assuming one exists
57
Jon Skeet

Une fois que vous avez fourni votre propre constructeur à class A, Aucun appel automatique ne se produit pendant la création de l'objet class B.

La première ligne de votre constructeur class B Doit être super(paramsToClassAConstructor) ou elle peut être appelée vers un autre constructeur avec dans class B En utilisant this(). Il est de la responsabilité du deuxième constructeur dans class B D'appeler le constructeur class A Dans ce cas.

6
Bhargav Kumar R

Lorsqu'un constructeur termine son exécution - l'objet est dans un état initial valide. Nous sommes censés utiliser des objets qui sont valides.
Lorsque nous fournissons un constructeur non par défaut pour la classe A - nous disons effectivement - pour construire un objet de classe A, c'est-à-dire pour être dans l'état initial valide - nous avons besoin de plus d'informations - qui sont fournies par les paramètres.
Compte tenu de cela, le compilateur aide en pas à générer le constructeur par défaut. Le code client ne parviendra pas à se compiler (comme il se doit - comment ferions-nous autrement que l'objet atterrisse dans un état valide?) - et le programmeur client devrait s'asseoir et en tenir compte.
Lorsque vous fournissez un constructeur vide explicite - vous dites en fait au compilateur - je sais ce que je fais - le constructeur par défaut initialisera très probablement les champs à des valeurs par défaut raisonnables.
Ou pour promouvoir la réutilisation - le constructeur par défaut peut appeler celui qui n'est pas par défaut avec certaines valeurs par défaut.
Une sous-classe connaît sa super classe - un constructeur de sous-classe peut invoquer des méthodes de super classe certaines méthodes couramment réutilisées dans les sous-classes). Compte tenu de ce qui précède - cela nécessite que la partie de la super classe soit dans un --- (état valide - c'est-à-dire que son constructeur a été exécuté avant toute invocation de sa méthode. Cela nécessite d'appeler le super constructeur avant le constructeur de la sous-classe.
Compte tenu de cela - vous serez facilement en mesure de concevoir votre constructeur pour appliquer le bon comportement de l'état initial.

3
atul