Le nom de polymorphisme vient du grec et signifie qui peut prendre
plusieurs formes.
Cette caractéristique essentielle de la programmation orientée
objet la caractérise
On distingue généralement trois types de polymorphisme :
- Le polymorphisme ad hoc (également surcharge ou en anglais
overloading)
- Le polymorphisme d'héritage (également
redéfinition, spécialisation ou en anglais
overriding)
- Le polymorphisme paramétrique (également
généricité ou
en anglais template)
Nous allons maintenant tenter de définir plus précisément
tout cela, mais il est important de noter que beaucoup de confusion existe
lorsqu'il s'agit de différencier tout ces polymorphismes.
Le polymorphisme ad hoc permet d'avoir des fonctions de même nom, avec des
fonctionnalités similaires, dans des classes sans aucun rapport entre
elles (si ce n'est bien sur d'être des filles de la classe objet). Par
exemple, la classe complexe, la classe image et la classe lien peuvent avoir une
fonction afficher. Cela permettra de ne pas avoir a ce soucier du type de
l'objet que l'on a si on souhaite l'afficher a l'écran.
Le polymorphisme paramétrique, appelé
généricité, représente la
possibilité de définir plusieurs
fonctions de même nom mais possédant
des paramètres différents (en nombre et/ou en type).
Le polymorphisme ad hoc rend ainsi possible le choix automatique de la
bonne méthode à
adopter en fonction du type de donnée passée en paramètre.
Ainsi, on peut par exemple définir plusieurs
méthodes homonymes addition()
effectuant une somme de valeurs.
- La méthode int addition(int, int) pourra retourner la somme de
deux entiers
- La méthode float addition(float, float) pourra retourner la
somme de deux flottants
- La méthode char addition(char, char) pourra définir au
gré de l'auteur la somme de deux caractères
- etc.
On appelle signature le nombre et le type (statique)
des arguments d'une fonction. C'est donc la signature
d'une méthode qui détermine quelle méthode sera
appelée.
Le polymorphisme ad hoc permet ainsi de définir des
opérateurs dont l'utilisation sera
différente selon le type des paramètres qui lui sont
passés. Il est donc possible par exemple de surcharger l'opérateur
+ et de lui faire réaliser des actions différentes selon
qu'il s'agit d'une opération entre deux entiers (addition) ou entre
deux chaînes de caractères (concaténation).
Le polymorphisme d'héritage caractérise la
possibilité de redéfinir
une méthode dans des classes héritant d'une classe de base. De
cette façon il est possible d'appeler la
méthode d'un objet sans se soucier de son type intrinsèque.
Imaginons un jeu d'échec comportant des objets
roi, reine, fou, cavalier, tour et
pion, héritant chacun de l'objet piece.
La méthode mouvement() pourra, grâce au polymorphisme
d'héritage, effectuer le mouvement
approprié en fonction de la classe de l'objet référencé au moment de
l'appel.Cela permettra notamment au programme de dire piece.mouvement sans
avoir à se preoccuper de la classe de la pièce
|