Aller au contenu principal

L'abstraction

Notions théoriques

Dans le monde de la programmation orientée objet, le polymorphisme est un concept selon lequel une classe peut être utilisée comme si elle était une autre classe.

Comment utiliser une classe comme si elle était une autre classe ?

Le polymorphisme est réalisé grâce à l'abstraction c'est à dire en utilisant des méthodes et des classes abstraites.

Une classe abstraite est une classe qui ne peut pas être instanciée. Elle sert de modèle pour les classes qui en héritent.

Les classes qui héritent d'une classe abstraite doivent implémenter toutes ses méthodes abstraites.

Une méthode abstraite est une méthode qui est déclarée, mais pas implémentée dans le code.

La classe qui hérite d'une classe abstraite doit fournir une implémentation pour chaque méthode abstraite.

attention

L'abstraction est un concept fondamental en programmation orientée objet (POO).

Exemple pratique

Poursuivons avec notre jeu de combat. Nous allons créer une classe abstraite Personnage avec une méthode abstraite attaquer. Les classes Guerrier et Magicien hériteront de cette classe et implémenteront la méthode attaquer.

abstract class Personnage {
// ...
abstract public function attaquer();

public function getNom() {
return $this->nom;
}
}

class Guerrier extends Personnage {
// ...
public function attaquer() {
print($this->getNom() . " attaque avec une force de " . $this->force . " points.\n");
}
}

class Magicien extends Personnage {
// ...
public function attaquer() {
print($this->getNom() . " lance un sort avec un niveau de magie de " . $this->magie . " points.\n");
}
}

Test de mémorisation/compréhension


Qu'est-ce qu'une classe abstraite en PHP ?


Qu'est-ce qu'une méthode abstraite en PHP ?


Comment réalise-t-on le polymorphisme en PHP ?


Peut-on instancier une classe abstraite en PHP ?



TP pour réfléchir et résoudre des problèmes

Pour ce TP, vous allez devoir implémenter le polymorphisme dans notre jeu de combat.

Vous allez créer une classe abstraite Personnage avec une méthode abstraite attaquer.

Les classes Guerrier et Magicien hériteront de cette classe et implémenteront la méthode attaquer.

Voici les étapes à suivre :

Dans le répertoire classes du répertoire jeu_combat (de la séance précédente) :

  1. Créez une classe abstraite Personnage. Cette classe contiendra les propriétés communes à tous les personnages de notre jeu, comme le nom, les points de vie et l'expérience. De plus, elle contiendra une méthode abstraite attaquer, qui sera définie dans les classes enfants.
abstract class Personnage {
private $nom;
private $pointsDeVie;
private $experience;

// ... (accesseurs et mutateurs pour les propriétés)

abstract public function attaquer();
}
  1. Créez une classe Guerrier qui hérite de Personnage. Cette classe doit implémenter la méthode attaquer de la classe parente.
class Guerrier extends Personnage {
private $force;

// ... (accesseurs et mutateurs pour la force)

public function attaquer() {
print($this->getNom() . " attaque avec une force de " . $this->force . " points.\n");
}
}
  1. Créez une classe Magicien qui hérite également de Personnage. Cette classe doit implémenter la méthode attaquer de la classe parente.

Nous allons renommer la méthode lancerSort() (de la séance précédente) en attaquer().

class Magicien extends Personnage {
private $magie;

// ... (accesseurs et mutateurs pour la magie)

public function attaquer() {
print($this->getNom() . " lance un sort avec un niveau de magie de " . $this->magie . " points.\n");
}
}
  1. Testez votre code en créant des instances des classes Guerrier et Magicien, en définissant leurs propriétés et en appelant la méthode attaquer.
$guerrier = new Guerrier();
$guerrier->setNom("Arthur");
$guerrier->setPointsDeVie(100);
$guerrier->setExperience(0);
$guerrier->setForce(50);
$guerrier->attaquer(); // Affiche "Arthur attaque avec une force de 50 points."

$magicien = new Magicien();
$magicien->setNom("Merlin");
$magicien->setPointsDeVie(80);
$magicien->setExperience(0);
$magicien->setMagie(100);
$magicien->attaquer(); // Affiche "Merlin lance un sort avec un niveau de magie de 100 points."

Vous avez maintenant une structure de base pour votre jeu de combat, utilisant le polymorphisme pour gérer différents types de personnages.

Une solution
Que se passe-t-il si vous n'implémenter pas la méthode attaquer() dans la classe Magicien ?

PHP affiche l'erreur : PHP Fatal error: Class Magicien contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Personnage::attaquer)