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.
|