TUTORIELS 
Comprendre le polymorphisme
L'hérédité propre à la programmation orientée-objet découle d'une autre notion: celle de polymorphisme, qui offre la possibilité à plusieurs objets de natures différentes d'exposer une interface identique au système, et ainsi répondre à un même message d'une manière qui leur est propre.  ( 23 avril 2003)
 

Introduction
L'hérédité propre à la programmation orientée-objet découle d'une autre notion: celle de polymorphisme, qui offre la possibilité à plusieurs objets de natures différentes d'exposer une interface identique au système, et ainsi répondre à un même message d'une manière qui leur est propre.

Pour prendre un exemple, le message "ajouter un à la valeur actuelle totale" ne doit pas produire les mêmes résultats suivant qu'il doit être compris dans le cadre d'un compte en banque, d'un carnet de notes ou d'une liste de courses. Le polymorphisme correspond à la possibilité de recourir à la même expression pour dénoter différentes opérations: en quelque sorte, il s'agit que les choses soient plus identiques qu'elles ne sont différentes.

Ces objets disposent d'une même interface, ce qui permet d'utiliser de manière uniforme des objets très différents. Le polymorphisme est donc un moyen de manipuler des objets hétéroclites de la même manière, pourvu qu'ils disposent d'une interface commune.

Deux manifestations
Le polymorphisme est rendu possible par le fait que le système peut voir un objet (twingo) comme étant de son type réel (voiture), ou du type d'une de ses super-classes (vehicule, renault, ...). Il peut ainsi se manifester sous deux formes:
- par création de sous-classe: une méthode peut être définie dans une classe et redéfinie dans une de ses sous-classes. Le même message aura des comportements différents selon qu'il est envoyé à un objet de l'une ou l'autre des classes.
- par surcharge: deux classes indépendantes peuvent posséder une méthode de même nom et répondre ainsi, chacune à sa manière, à un même message.

Cas d'école: la méthode surface() est différente pour carre, triangle et cercle. Mais on peut créer une classe forme dont carre, triangle et cercle sont les extensions: chacune des trois formes aura sa propre méthode surface(), mais toutes répondront de la même manière à la méthode deplacer(x,y) définie au sein de forme.

En séparant le quoi du comment, le polymorphisme permet d'obtenir un code plus propre, mieux organisé et lisible, et bien plus flexible: étant donnée que les objets de classes dérivées peuvent être utilisée en lieu et place d'objets des classes de base, la dépendance entre le modules devient bien moindre.

> Polymorphisme par sous-typage
C'est la forme la plus naturelle du polymorphisme: elle permet d'appeler la méthode d'un objet sans devoir connaître son type. Le sous-typage n'est pas une forme d'héritage:
- on peut faire du sous-typage sans héritage, c'est-à-dire forcer le type d'un objet à être sous-type du type d'un autre objet sans que la classe du premier soit héritière de la classe du second,
- il est possible d'avoir un héritage de classes sans pouvoir faire du sous-typage entre instances de ces classes.

> Polymorphisme ad-hoc
Il permet d'avoir les mêmes méthodes au sein de classes différentes et indépendantes. Essentiellement, il surcharge la classe.

> Polymorphisme généralisé/universel/paramétrique

Il offre la possibilité de définir plusieurs fonctions génériques du même nom, mais acceptant des arguments différents. Le polymorphisme est important car il permet aux programmes clients d'être écrits en ne se basant que sur les interfaces des objets qui seront manipulés. Ainsi, tant que les nouveaux objets créés se conforment à l'interface originelle, ont peut facilement étendre le programme et lui ajouter de nouvelles classes. Les nouvelles classes peuvent fonctionner sans faille avec les plus anciennes.

 
[ Xavier Borderie,JDNet
 
Accueil | Haut de page