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?)
Maintenant, lors de la création d'une nouvelle instance de la classe
B
, quel constructeur de la classeA
est appelé automatiquement avant d'appeler le constructeur de la classeB
?
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
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.
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.