En partant avec Mistu pour Seattle, devinez le sujet de discussion......
Pour ceux qui le connaisse, vous savez qu' il a toujours plus d' un quiz dans son sac.
prenons deux classes
lors de l' instanciation de la classe Dog, dans quel ordre s' exécute les constructeurs ?
class Program
{
static void Main(string[] args)
{
Dog d = new Dog();
Console.ReadLine();
}
}
class Animal
{
public Animal()
{
Console.WriteLine("Animal constructor");
}
}
class Dog : Animal
{
public Dog()
: base()
{
Console.WriteLine("Dog constructor");
}
}
c' est relativement facile, le constructeur de la classe "Animal" est exécuter en premier.
Ajoutons des membres.
class Program
{
static void Main(string[] args)
{
Dog d = new Dog();
Console.ReadLine();
}
}
class Animal
{
int _age = 0;
public Animal()
{
Console.WriteLine("Animal constructor");
}
}
class Dog : Animal
{
int _category = 1;
public Dog()
: base()
{
Console.WriteLine("Dog constructor");
}
}
1) à quel moment ces membres sont initialisés ces membres ?
2) dans quel ordre sont initialisés "_age" et "_category" ?
si vous copier le code dans Visual Studio, et que vous placez des points d' arrêts sur les constructeurs et membres vous obtiendrais le résultat suivant :
- initialisation de "_category"
- initialisation de _"age"
- exécution du constructeur Animal
- exécution du constructeur Dog
Mais pourquoi les membres sont initialisés dans le sens inverse (Dog, puis Animal) de l' exécution des constructeurs ?
La raison est simple : c' est à cause de la polymorphie.
En effet depuis le constructeur Animal, il est possible de faire appel à une méthode polymorphe, qui serait surchargée par Dog.
class Animal
{
int _age = 0;
public Animal()
{
testMethod();
Console.WriteLine("Animal constructor");
}
protected virtual void testMethod()
{
}
}
class Dog : Animal
{
int _category = 1;
public Dog()
: base()
{
Console.WriteLine("Dog constructor");
}
protected override void testMethod()
{
Console.WriteLine("Dog testMethod");
}
}
Ainsi lors de l 'exécution de Dog.testMethod(), "_category" est initialisée alors que le constructeur n' a pas été encore exécuté.
Il est vrai que l'on ne pose pas tous les jours ce genre de questions, mais il toujours intéressant de savoir comment ça marche.