Polymorphisme

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.