Le nom de la méthode calculPrime() dénote alors 2 codes distincts. Autrement dit l'identificateur calculPrime représente "plusieurs formes" de code distinct. On parle de polymorphisme.
On utilise le polymorphisme à l'aide d'un référence
d'objet de classe de base. Par exemple on écrit en Java :
Employee e = new Employee();
e.calculPrime(); // lance la méthode calculPrime()
de la classe Employee
mais aussi
Employee e = new Manager();
e.calculPrime(); // lance la méthode calculPrime()
de la classe Manager
Un des avantages de ceci est de pouvoir utiliser une seule référence e de la classe Employee pour référencer un Employee ou un Manager. C'est possible car un Manager (classe dérivée de la classe Employee) est un Employee : sémantique de l'héritage.
Polymorphisme = liaison dynamique
Le gros avantage du polymorphisme est de pouvoir référencer des objets sans connaître leur classe véritable au moment de la compilation, et de pouvoir au moment de l'exécution, lancer le code approprié à cet objet.
On peut ainsi écrire un code comme :
Voulez vous créer un Manager ou un Employe
?
lire reponse
si reponse = Manager alors e = reference a un Manager
fsi
si reponse = Employe alors e = reference a un Employe
fsi
La prime de la personne est : e.calculPrime();
Au moment de la compilation, le compilateur ne sait pas si c'est la méthode calculPrime() de la classe Employee ou celle de la classe Manager qui sera lancée. Cela dépend en fait du choix de l'utilisateur du programme au moment de son exécution.
Autrement dit, la liaison entre l'identificateur calculPrime et le code à lancer est déterminé à l'exécution du programme (suivant le choix de l'utilisateur du programme). On dit alors que la liaison est dynamique.
Polymorphisme : conclusion
Remarquer que si e réfère un Manager, l'appel de la méthode e.calculPrime() de la classe Employee n'est pas fait (sauf si mentionner explicitement par le programmeur dans le code de la méthode calculPrime() de la classe Manager). Le code à lancer est déterminé suivant la classe de l'objet et non pas la classe de la référence à cet objet.
Comment cela fonctionne t il ?
Java est dit un langage objet pur (comme Smalltalk et
contrairement à C++) car le mécanisme de recherche de la
méthode à lancer est automatique et systématique sans
que le programmeur ait à le préciser.
En Java un appel comme : e.calculPrime(); recherche,
au moment de l'exécution l'objet référencé
par e. Connaissant alors l'objet, l'interpréteur cherche,
si dans la classe de cet objet, cette méthode existe. Si c'est le
cas, cette méthode est lancée et le processus est terminé.
Si ce n'est pas le cas, l'interpréteur refait cette recherche dans
la classe de base et le processus est relancé sur cette classe de
base, jusqu'à trouver une telle méthode. Si une telle méthode
n'est pas trouvée, une exception est levée.
Ce mécanisme qui a le mérite d'être simple pour le programmeur, a l'inconvénient d'être indéterministe en temps de recherche et de pouvoir être lent à l'exécution (d'où un autre mécanisme déterministe proposé dans des langages comme C++).
En conclusion il est fondamental de voir que pour utiliser
le polymorphisme, il faut toutes les conditions suivantes :
- avoir une arborescence d'héritage sur les classes
- l'utiliser à l'aide de référence
d'objet de la classe de base.
- avoir deux méthodes de même signature
définies l'une dans la classe de base, l'autre dans la classe dérivée.