Le polymorphisme
CHAPITRE 13
282
Considérons la classe Pointcol, dotée d’une méthode similaire :
classe Pointcol dériveDe Point
{ Pointcol méthode clone
{ Pointcol pc
.....
retourne pc
}
.....
}
Considérons notre situation de polymorphisme habituelle :
Point p
Pointcol pc
.....
p := Création Pointcol (...)
et intéressons-nous à l’appel p.clone. La référence p est de type Point ; on trouve dans
Point une méthode clone fournissant un résultat de type Point. C’est sur cette signature
(vide) et ce type de résultat (Point) que l’on se base pour explorer la hiérachie d’héritage, à
partir de Point pour effectuer la ligature dynamique voulue, basée ici sur le type de l’objet
référencé par p, c’est-à-dire Pointcol. On trouve bien dans Pointcol une méthode clone
de bonne signature, mais son résultat n’a pas le type voulu. Les règles strictes du polymorphisme telles que nous les avons exposées conduiraient, ici encore, à appeler la méthode
clone de Point.
Toutefois, on voit qu’on se trouve ici dans une situation très particulière, à savoir que :
• la méthode clone de Point, appliquée à un objet de type Point, renvoyait une référence
à un Point,
• la méthode clone de Pointcol, appliquée à un objet de type Pointcol renvoie une
référence à un Pointcol...
Cette situation paraît presque naturelle, au point que beaucoup de langages autorisent une
dérogation à la règle concernant le type du résultat, connue souvent sous le nom de « valeurs
de retour covariantes ». Elle consiste à considérer que, dans la recherche de la ligature dynamique, on peut tolérer un écart sur le type du résultat lorsque celui-ci est du type de la classe
de la référence concernée. Plus précisément :
• soit p est une référence à un objet de type T et m une méthode de T renvoyant une référence
de type T ;
• soit T’ une classe dérivée de T, redéfinissant la méthode m, de manière à ce qu’elle renvoie
une référence de type T’.
Dans ces conditions, si à un moment donnée p contient la référence d’un objet de type T’,
l’appel p.m peut être résolu dynamiquement par l’appel de la méthode m de T’.
CHAPITRE 13
282
Considérons la classe Pointcol, dotée d’une méthode similaire :
classe Pointcol dériveDe Point
{ Pointcol méthode clone
{ Pointcol pc
.....
retourne pc
}
.....
}
Considérons notre situation de polymorphisme habituelle :
Point p
Pointcol pc
.....
p := Création Pointcol (...)
et intéressons-nous à l’appel p.clone. La référence p est de type Point ; on trouve dans
Point une méthode clone fournissant un résultat de type Point. C’est sur cette signature
(vide) et ce type de résultat (Point) que l’on se base pour explorer la hiérachie d’héritage, à
partir de Point pour effectuer la ligature dynamique voulue, basée ici sur le type de l’objet
référencé par p, c’est-à-dire Pointcol. On trouve bien dans Pointcol une méthode clone
de bonne signature, mais son résultat n’a pas le type voulu. Les règles strictes du polymorphisme telles que nous les avons exposées conduiraient, ici encore, à appeler la méthode
clone de Point.
Toutefois, on voit qu’on se trouve ici dans une situation très particulière, à savoir que :
• la méthode clone de Point, appliquée à un objet de type Point, renvoyait une référence
à un Point,
• la méthode clone de Pointcol, appliquée à un objet de type Pointcol renvoie une
référence à un Pointcol...
Cette situation paraît presque naturelle, au point que beaucoup de langages autorisent une
dérogation à la règle concernant le type du résultat, connue souvent sous le nom de « valeurs
de retour covariantes ». Elle consiste à considérer que, dans la recherche de la ligature dynamique, on peut tolérer un écart sur le type du résultat lorsque celui-ci est du type de la classe
de la référence concernée. Plus précisément :
• soit p est une référence à un objet de type T et m une méthode de T renvoyant une référence
de type T ;
• soit T’ une classe dérivée de T, redéfinissant la méthode m, de manière à ce qu’elle renvoie
une référence de type T’.
Dans ces conditions, si à un moment donnée p contient la référence d’un objet de type T’,
l’appel p.m peut être résolu dynamiquement par l’appel de la méthode m de T’.
