Limites de l’héritage et du polymorphisme
281
• la classe Pointcol, dérivée de Point, définit une autre méthode nommée identique
pour prendre en compte non seulement l’égalité des coordonnées, mais aussi celle de la
couleur :
Pointcol pc1, pc2
.....
pc1.identique(pc2)
// vrai si pc1 et pc2 ont mêmes coordonnées et même couleur
Soient alors ces déclarations :
Point p1, p2
p1 := Création Pointcol (1, 2, 5)
p2 := Création Pointcol (1, 2, 8)
Considérons cette expression :
p1.identique(p2) // est vrai
Elle a pour valeur vrai alors que nos deux points colorés n’ont pas la même couleur.
L’explication réside tout simplement dans la bonne application des règles relatives au polymorphisme. En effet, à la rencontre de cette expression p1.identique(p2), on se fonde
sur le type de p1 pour en déduire que l’en-tête de la méthode identique à appeler est de la
forme booléen identique (Point). La ligature dynamique tient compte du type de
l’objet réellement référencé par p1 (ici Pointcol) pour définir la classe à partir de laquelle
se fera la recherche de la méthode voulue. Mais comme dans Pointcol, la méthode identique n’a pas la signature voulue, on poursuit la recherche dans les classes ascendantes et,
finalement, on utilise la méthode identifie de Point. D’où le résultat constaté.
Bien entendu, ici, la méthode identifie de Pointcol n’était pas une redéfinition de la
méhtode identifie de Point. Mais, l’aviez-vous remarqué ?
4.2 Valeurs de retour covariantes
Dans l’exemple précédent, nous aurions souhaité obtenir un certain comportement qui, en
fait, n’entrait pas dans le cadre du polymorphisme.
Considérons maintenant une classe Point, dotée d’une méthode de copie nommée clone,
fournissant en résultat une référence sur un objet de type Point :
classe Point
{ Point méthode clone
{ Point p
.....
retourne p
}
.....
}
281
• la classe Pointcol, dérivée de Point, définit une autre méthode nommée identique
pour prendre en compte non seulement l’égalité des coordonnées, mais aussi celle de la
couleur :
Pointcol pc1, pc2
.....
pc1.identique(pc2)
// vrai si pc1 et pc2 ont mêmes coordonnées et même couleur
Soient alors ces déclarations :
Point p1, p2
p1 := Création Pointcol (1, 2, 5)
p2 := Création Pointcol (1, 2, 8)
Considérons cette expression :
p1.identique(p2) // est vrai
Elle a pour valeur vrai alors que nos deux points colorés n’ont pas la même couleur.
L’explication réside tout simplement dans la bonne application des règles relatives au polymorphisme. En effet, à la rencontre de cette expression p1.identique(p2), on se fonde
sur le type de p1 pour en déduire que l’en-tête de la méthode identique à appeler est de la
forme booléen identique (Point). La ligature dynamique tient compte du type de
l’objet réellement référencé par p1 (ici Pointcol) pour définir la classe à partir de laquelle
se fera la recherche de la méthode voulue. Mais comme dans Pointcol, la méthode identique n’a pas la signature voulue, on poursuit la recherche dans les classes ascendantes et,
finalement, on utilise la méthode identifie de Point. D’où le résultat constaté.
Bien entendu, ici, la méthode identifie de Pointcol n’était pas une redéfinition de la
méhtode identifie de Point. Mais, l’aviez-vous remarqué ?
4.2 Valeurs de retour covariantes
Dans l’exemple précédent, nous aurions souhaité obtenir un certain comportement qui, en
fait, n’entrait pas dans le cadre du polymorphisme.
Considérons maintenant une classe Point, dotée d’une méthode de copie nommée clone,
fournissant en résultat une référence sur un objet de type Point :
classe Point
{ Point méthode clone
{ Point p
.....
retourne p
}
.....
}
