En faisant hier soir un petit tour sur des forums dédiés au développement, j’ai trouvé une question intéressante à propos des mots clé abstract et virtual. Le développeur cherchait à comprendre le fonctionnement de ces outils très puissants mais qui peuvent être complexe à comprendre.
Je pense que la plupart des lecteurs de ce blog connaissent sur le bout des doigts les concepts objets mais une piqure de rappel est toujours intéressante !
Première partie : Le mot clé abstract
Si l’on fait un tour sur la MSDN on apprend que le mot clé abstract peut être utilisé pour des classes, des méthodes, propriétés, indexers et événements. Si l’on déclare une classe comme étant abstraite, on indique que c’est une classe de base.
Avec le mot clé abstract il faut toutefois suivre quelques principes :
- Il est impossible d’instancier une classe abstraire. Humain n’est pas un type concret, c’est une classe regroupant des comportements / similitudes entre les humains concrets (homme et femme).
- Une classe abstraite ne peut contenir que des éléments (méthodes, propriétés, …) eux aussi abstraits.
- Tous les comportements définis de façon abstrait doivent être implémentés dans les classes concrètes.
Voyons maintenant comme tester ce concept …(Facilement !)
Nous voulons représenter dans notre programme des hommes et des femmes. Ces hommes et femmes ont des comportements similaire et nous pouvons donc décider de les regrouper dans une entité de base : une classe Humain. La phrase que l’on peut tester c’est « Les hommes et les femmes sont-ils des Humains ? ». A priori oui donc notre classe de base est un bon départ !
Voici comment pourrait se décrire la classe abstraite Humain
/// <summary>
/// Classe Abstraite qui défini des comportements communs
/// </summary>
public abstract class Humain
{
#region Methodes
public abstract void Marcher();
public abstract void Parler();
#endregion
}
Voyons maintenant l’implémentation des classes concrètes.
/// <summary>
/// Classe concréte, hérite de Humain. Défini les comportements concrets pour un Homme
/// </summary>
public class Femme : Humain
{
public override void Marcher()
{
Console.WriteLine("Une femme qui marche");
}
public override void Parler()
{
Console.WriteLine("Une femme qui parle");
}
}
/// <summary>
/// classe concréte, hérite de Humain. Défini les comportements concrets pour un Homme
/// </summary>
public class Homme : Humain
{
public override void Marcher()
{
Console.WriteLine("Un homme qui marche");
}
public override void Parler()
{
Console.WriteLine("Un homme qui parle");
}
}
Terminons par le programme
class Program
{
static void Main(string[] args)
{
// Création de type Humain mais instanciation des types concrets
Humain vMan = new Homme();
Humain vWoman = new Femme();
// On appel les méthodes communes.
vMan.Marcher();
vWoman.Marcher();
vMan.Parler();
vWoman.Parler();
Console.Read();
}
}

