Le polymorphisme
CHAPITRE 13
280
Remarque
Cet exemple pourrait se généraliser facilement à plusieurs classes dérivées de Point. En
revanche, les choses seraient moins claires en ce qui concerne la généralisation à des classes
dérivées de Pointcol. Quoi qu’il en soit, il faut surtout considérer que l’on a affaire ici à un
« exemple d’école » présentant un appel d’une méthode qui n’est pas encore définie. Nous
verrons d’ailleurs que les classes abstraites et les interfaces permettront de formaliser cet
aspect.
4 Limites de l’héritage et du polymorphisme
Comme nous venons de le voir, le polymorphisme se fonde sur la redéfinition des méthodes.
Par exemple, p.affiche appelle la méthode affiche de Point ou la méthode affiche
de Pointcol. Mais, nous avions fait appel à des exemples simples et relativement intuitifs.
Comme nous l’avons indiqué au paragraphe 6 du chapitre 12, page 259, cette redéfinition utilise la signature de la méthode concernée et, en particulier, dans certains langages, elles peut
interférer avec la notion de surdéfinition et aboutir ainsi à des situations parfois très complexes (dont on a toutefois rarement besoin pour faire du « bon polymorphisme » !). Sans entrer
dans ces détails, nous allons quant même attirer votre attention sur deux points :
• les limitations du polymorphisme : nous vous présenterons une situation dans laquelle on
aurait aimé qu’il s’applique ;
• l’existence de ce que l’on nomme dans certains langages des « valeurs de retour covariantes».
4.1 Les limitations du polymorphisme
Nous avons vu que le polymorphisme se base à la fois sur le type de la référence concernée et
sur celui de l’objet référencé. Revenons sur le rôle exact de chacun de ces éléments :
• le type de la référence définit la signature de la méthode à appeler et le type de son résultat ;
• le type de l’objet référencé provoque la recherche (en remontant éventuellement dans la
« hiérarchie d’héritage ») d’une méthode ayant la signature et le type de résultat voulus.
Cela peut vous paraître quasi évident maintenant. Pourtant, considérez la situation suivante
dans laquelle :
• la classe Point dispose d’une méthode identique fournissant la valeur vrai lorsque le
point fourni en paramètre a les mêmes coordonnées que le point courant :
Point p1, p2
.....
p1.identique(p2)
// vrai si p1 et p2 ont mêmes coordonnées
CHAPITRE 13
280
Remarque
Cet exemple pourrait se généraliser facilement à plusieurs classes dérivées de Point. En
revanche, les choses seraient moins claires en ce qui concerne la généralisation à des classes
dérivées de Pointcol. Quoi qu’il en soit, il faut surtout considérer que l’on a affaire ici à un
« exemple d’école » présentant un appel d’une méthode qui n’est pas encore définie. Nous
verrons d’ailleurs que les classes abstraites et les interfaces permettront de formaliser cet
aspect.
4 Limites de l’héritage et du polymorphisme
Comme nous venons de le voir, le polymorphisme se fonde sur la redéfinition des méthodes.
Par exemple, p.affiche appelle la méthode affiche de Point ou la méthode affiche
de Pointcol. Mais, nous avions fait appel à des exemples simples et relativement intuitifs.
Comme nous l’avons indiqué au paragraphe 6 du chapitre 12, page 259, cette redéfinition utilise la signature de la méthode concernée et, en particulier, dans certains langages, elles peut
interférer avec la notion de surdéfinition et aboutir ainsi à des situations parfois très complexes (dont on a toutefois rarement besoin pour faire du « bon polymorphisme » !). Sans entrer
dans ces détails, nous allons quant même attirer votre attention sur deux points :
• les limitations du polymorphisme : nous vous présenterons une situation dans laquelle on
aurait aimé qu’il s’applique ;
• l’existence de ce que l’on nomme dans certains langages des « valeurs de retour covariantes».
4.1 Les limitations du polymorphisme
Nous avons vu que le polymorphisme se base à la fois sur le type de la référence concernée et
sur celui de l’objet référencé. Revenons sur le rôle exact de chacun de ces éléments :
• le type de la référence définit la signature de la méthode à appeler et le type de son résultat ;
• le type de l’objet référencé provoque la recherche (en remontant éventuellement dans la
« hiérarchie d’héritage ») d’une méthode ayant la signature et le type de résultat voulus.
Cela peut vous paraître quasi évident maintenant. Pourtant, considérez la situation suivante
dans laquelle :
• la classe Point dispose d’une méthode identique fournissant la valeur vrai lorsque le
point fourni en paramètre a les mêmes coordonnées que le point courant :
Point p1, p2
.....
p1.identique(p2)
// vrai si p1 et p2 ont mêmes coordonnées
