Sera le constructeur de classe de base est automatiquement appelé?
class Person
{
public int age;
public Person()
{
age = 1;
}
}
class Customer : Person
{
public Customer()
{
age += 1;
}
}
Customer customer = new Customer();
Serait l'âge de la clientèle 2? Il semble que la classe de base du constructeur sera appelé n'importe quoi. Si oui, pourquoi avons-nous besoin d'appeler base
à la fin, parfois?
public Customer() : base()
{
.............
}
- Techniquement,
age
est un membre privé, donc ça ne compile pas. Il faudraitpublic
, etc pour travailler. - Désolé, je ne le savais pas. Mais c'est juste pour préciser ma question.
- Si vous spécifiez ni
: base(...)
ni: this(...)
pour un non-constructeur statique, la valeur par défaut est: base()
c'est à dire le zéro paramètre de base le constructeur de la classe. Vous avez aussi la première classePerson
où votrePerson()
constructeur appelle implicitement laObject()
constructeur de classe de base. Écrit: base()
(arguments zéro) est toujours redondants. Essayez également de votre exemple, là où laPerson
constructeur de la classe prend un ou plusieurs paramètres. - non statique est une instruction de clé il y, note ce gotcha concernant les constructeurs statiques: stackoverflow.com/questions/20092211/...
Vous devez vous connecter pour publier un commentaire.
C'est tout simplement la façon dont C# est d'aller travailler. Les constructeurs de chaque type dans la hiérarchie des types seront appelés dans l'ordre de Plus de Base -> la Plupart des Dérivés.
Donc, dans votre cas particulier, il appelle
Person()
, puisCustomer()
dans le constructeur de commandes. La raison pour laquelle vous avez besoin d'utiliser parfois lebase
constructeur, c'est quand les constructeurs ci-dessous le type de courant ont besoin de paramètres supplémentaires. Par exemple:Pour construire une
AlwaysThreeDerived
objet, il dispose d'un constructeur sans paramètre. Cependant, laBase
un type qui n'est pas. Donc pour créer un parametersless constructeur, vous devez fournir un argument à la base constuctor, que vous pouvez faire avec lebase
mise en œuvre.Oui, le constructeur de classe de base sera appelé automatiquement. Vous n'avez pas besoin d'ajouter un appel explicite à
base()
quand il y a un constructeur sans arguments.Vous pouvez facilement tester cela par l'impression de l'âge du client après la construction (lien vers ideone avec une démo).
Si vous n'avez pas un défaut constructeur sans paramètre alors il y aurait un besoin d'appeler l'un avec les paramètres:
En c# à l'aide de classes de base et dérivées, IL FAUT CERTAINES IMPLICITE OU EXPLICITE d'un APPEL VERS un CONSTRUCTEUR DANS LA CLASSE de BASE DE LA CLASSE DÉRIVÉE.
Je n'ai pas compris comment tout cela fonctionnait jusqu'à ce que j'ai réalisé que fait.
En d'autres mots, lorsque vous vous connectez à une base de classe à une classe dérivée, certains constructeur doit être appelée dans la classe de base de la dérivée. La classe de base est toujours instancié premier de la classe dérivée par l'intermédiaire d'un appel vers un constructeur dans la classe de base. C# ne se soucie pas si c'est un constructeur par défaut ou de la non-constructeur par défaut avec les paramètres. C'est pourquoi vous pouvez laisser un constructeur par défaut dans toutes vos classes comme son appelé implicitement que SI aucune non-constructeur avec paramètre(s) est ajouté dans la classe de base.
Quand vous avez soudainement ajouter un non-par défaut du constructeur avec paramètre(s), il rompt le défaut caché de constructeur par défaut de la chaîne de création et d'appels. Dans votre classe de Base avec un non-constructeur par défaut, vous devez maintenant d'appeler que constructeur explicitement à partir de la classe dérivée ou ajouter un constructeur par défaut explicitement dans la classe de base.
Nous allons tester cela.....
La raison tous les éléments ci-dessus est soit:
1. L'appel au constructeur par défaut de la classe de base est créé implicitement dans la classe de base et implicitement appelé à partir de la dérivée, car le non-constructeur par défaut a été ajoutée à la classe de base ou
2. Il y a un appel explicite à la non-par défaut , en fonction de paramètre de constructeur à l'aide de la base(myparamter)
base()
est appelé par défaut mais il peut être utilisé pour d'autres fins telles que :par exemple:
Cas 1: si le parent a paramétrées constructeur, mais pas de défaut ou de non-arg constructeur.
Cas 2: lorsque des parents ont plus d'un constructeur avec un nom par défaut.
Ici nous appelons un non-arg constructeur manuellement par la base() pour effectuer certaines intilizations mais ne'e passé toute valeur.
Espère que cela va vous aider.
Je n'ai pas grand-chose à ajouter, mais j'ai trouvé que j'ai besoin d'appeler MyConstructor() : base() sans paramètres dans 1 cas. J'ai une classe de base qui implémente INotifyPropertyChanged dans une voie où j'ai un RegisterProperties() une fonction virtuelle. Quand je la remplacer, elle est appelée dans le constructeur de base. Donc je finis par avoir à appeler dans la plus récemment dérivés sous-classes, parce que la base était apparemment appelé avant le substituée virtuel a été reconnu. Mon propriétés ne pas notifier à moins que je le fais. L'ensemble de la classe de base est ci-dessous.
J'ai ajouté un DatabaseTraits sous-classe directement en dessous. Sans la base vide() appel, mes propriétés, ne les appelez pas OnPropertyChanged().