Pourquoi une classe abstraite a-t-elle un constructeur? À quoi ça sert? Il est évident que nous ne pouvons pas créer une instance d'une classe abstraite.
Une raison importante est due au fait qu'il existe un appel implicite au constructeur de base avant l'exécution du constructeur dérivé. Gardez à l'esprit que contrairement aux interfaces, les classes abstraites contiennent une implémentation. Cette implémentation peut nécessiter une initialisation de champ ou d'autres membres d'instance. Notez l'exemple suivant et la sortie:
abstract class Animal
{
public string DefaultMessage { get; set; }
public Animal()
{
Console.WriteLine("Animal constructor called");
DefaultMessage = "Default Speak";
}
public virtual void Speak()
{
Console.WriteLine(DefaultMessage);
}
}
class Dog : Animal
{
public Dog(): base()//base() redundant. There's an implicit call to base here.
{
Console.WriteLine("Dog constructor called");
}
public override void Speak()
{
Console.WriteLine("Custom Speak");//append new behavior
base.Speak();//Re-use base behavior too
}
}
Bien que nous ne puissions pas construire directement un Animal
avec new
, le constructeur est implicitement appelé lorsque nous construisons un Dog
.
SORTIE:
Constructeur d'animaux appelé
Constructeur de chiens appelé
Parler personnalisé
Parler par défaut
Vous pouvez toujours initialiser toutes les variables, dépendances et vous pouvez configurer la signature des constructeurs des classes héritées.
Vous voulez généralement des classes abstraites lorsque vous avez besoin de stratégies différentes pour certains cas particuliers, il est donc logique de pouvoir faire tout le reste dans la classe abstraite. Et c'est une bonne pratique de faire le constructeur protected
.