Le polymorphisme

Manipuler des objets sans se soucier de leur type

11 mai 2014

Le but de ce tutoriel est d'expliquer le polymorphisme.

Il existe plusieurs sortes de polymorphisme : polymorphisme paramétré (connu par les notions de generics en java ou templates en C++), par sous-typage, ad-hoc polymorphisme (surcharge de méthode) etc... En règle générale, lorsque quelqu'un vous parle de polymorphisme sans préciser son type, c'est du polymorphisme par sous-typage dont il est question. C'est lui qui sera étudié ici.

Le polymorphisme

Le polymorphisme en général est une méthode de conception qui consiste à ajouter une couche d'abstraction vis à vis du type des données manipulées. Dans le polymorphisme par sous-typage, on parle de méthode polymorphe lorsque l'on peut appeler une méthode sur un objet sans se soucier de son type.

Un cas concret

Vous développez une page sur un site de jeux en ligne pour afficher toutes les règles. La méthode la plus sale consisterait à créer une fonction différente pour chaque jeu.

A ne pas faire

afficherReglesPoker();
afficherReglesRoulette();
...

Sympa si vous avez 3000 jeux... Ce code est inmaintenable, verbeux, bref c'est le mal absolu .

Grâce au polymorphisme, nous allons chercher à mettre en commun une action et à faire en sorte qu'elle soit applicable sur chacun des jeux présents. Vous l'aurez compris l'action c'est l'affichage de la règle du jeu.

Si l'on code avec le paradigme objet cela se traduit comme ça :

Exemple de polymorphisme

interface IJouable
{
        public function afficherRegles();
}

class Poker implements IJouable
{
        public function afficherRegles()
        {
                echo "Voici les règles du poker : Le joueur dispose de 7 cartes...";
        }
}

class Roulette implements IJouable
{
        public function afficherRegles()
        {
                echo "Voici les règles de la roulette : faites vos jeux...";
        }
}

$tousLesJeux = array('Poker', 'Roulette');

foreach($tousLesJeux AS $nomJeu)
{
        $jeu = new $nomJeu;
        $jeu->afficherRegles();
}

Comme vous pouvez le remarquer, on exécute la méthode afficherRegles() sans nous soucier de l'objet sur lequel on l'appelle. Bien que les objets soient de différents types (Poker et Roulette), on sait que la méthode afficherRegles existera puisqu'ils implémentent l'interface IJouable. Garantir le polymorphisme dans un programme est l'une des principales causes de la création de contrats grâce aux interfaces.

Non seulement votre code gagne en non-verbosité, mais il devient très simple d'ajouter un jeu de blackjack par exemple.

J'espère que vous comprenez l'intérêt d'un code polymorphe. Si ce n'est pas le cas n'hésitez pas à me demander des précisions dans les commentaires.

A bientôt !

Par
Créateur et administrateur.

Dans la même catégorie

Le design pattern stratégie
Le design pattern chaîne de responsabilité
Le design pattern décorateur
Le design pattern Adapter
Comment générer du code à partir d'un diagramme UML ?
Le design pattern Visiteur
Le design pattern Singleton
L'injection de dépendances
Le design pattern Double dispatch
Fabrique : un design pattern qui construit vos objets

Commentaire(s)