Cours 4 - Classes abstraites

Classes et méthodes abstraites

Les classes abstraites

Une classe abstraite est une classe qui ne peut pas être instanciée. Les classes abstraites sont généralement utilisées comme des classes de base pour d’autres classes. Elles peuvent fournir des comportements de base, mais sont généralement incomplètes (on y met que ce qui est en commun avec les classes filles).

Jusqu’à maintenant dans nos exemples, nous avions trois classes : Personnage, Guerrier et Mage. On souhaite pouvoir maintenant autoriser la création uniquement de Guerriers ou de Mages. Il n’y a plus de sens de créer des instances de Personnage maintenant. Cette classe doit donc devenir une classe abstraite.


Personnage.cs

public abstract class Personnage { ... }

Pour cela, on utilise le mot-clé abstract pour déclarer la classe comme une classe abstraite.

Les méthodes abstraites

Les méthodes abstraites sont des méthodes qui ne contiennent aucune implémentation, donc aucun code. Ces méthodes doivent obligatoirement être implémentés dans les classes filles.

Dans notre exemple, ici les Guerriers et les Mages peuvent attaquer tous les deux, sauf que l’un attaque grâce à sa force, l’autre grâce à sa magie. Ils ont donc tous les deux la même action avec des comportements différents.

De même, si l’on a un personnage de type Dresseur, il attaque avec ses animaux, ce qui est encore différent.


Personnage.cs

public abstract class Personnage {
    public abstract void Attaquer();
}

Pour déclarer une méthode abstraite, il faut utiliser le mot-clé abstract et ne donner aucun code à la méthode. De plus la méthode doit se terminer par un ;. IMPORTANT: Dès qu’une classe possède une méthode abstraite, la classe doit être elle aussi abstraite.


Guerrier.cs

public class Guerrier : Personnage {
     public void Attaquer() {
        Console.Out.WriteLine("Attaque a " + Force 
        +" de Force");
     }
}

Mage.cs

public class Mage : Personnage {
     public void Attaquer() {
        Console.Out.WriteLine("La un sort a " + Magie 
        +" de Magie");
     }
}

Intérêt des méthodes abstraites

L’intérêt des classes abstraites réside surtout à avoir accès à des méthodes d’une classe dont on ne connaît pas le type de la classe fille. Prenons l’exemple suivant:

Programme.cs

static void Main(string[] args) {
  Personnage unPerso = UnPersoAleatoire();
  unPerso.attaquer();
}

La méthode UnPersoAleatoire() retourne un Personnage au hasard qui peut être un Guerrier ou un Mage. On souhaite ensuite utiliser la méthode attaquer(), l’objet Personnage utilisera celui de la classe fille définie.

Résultat

Attaque a 345 de Force