L’héritage
CHAPITRE 12
262
classe Point
{ .....
méthode déplace (entier dx, entier dy) { ..... }
.....
}
classe Pointcol dériveDe Point
{ .....
méthode déplace (entier dx, entier dy, entier dc) { ..... }
.....
}
Pointcol pc
pc.déplace (3, 5)
// méthode appelée ?
Cette fois, l’instruction pc.déplace(3, 5) ne peut plus appeler la méthode déplace de
Pointcol puisqu’elle ne prévoit pas le bon nombre de paramètres. On peut alors se demander si elle va appeller la méthode déplace de Point. Autrement dit, Pointcol dispose-t-elle
de deux méthodes déplace (comme si l’on avait affaire à une surdéfinition). La réponse va
malheureusement dépendre du langage concerné et elle tient à la manière dont ce langage va
faire cohabiter ces notions (différentes) de :
• surdéfinition : plusieurs méthodes accessibles, identifiées par leur signature (revoyez
éventuellement le paragraphe 4.6 du chapitre 8, page 162) ;
• redéfinition : une seule méthode accessible à un objet de type donné : une redéfinition masque une méthode de même nom d’un ascendant...
Ici, nous ne chercherons pas à examiner de telles situations en détail (ce qui peut devenir très
complexe, et parfois un peu éloigné d’une bonne pratique de la programmation orientée
objet). Nous nous contenterons simplement de définir précisément ce qu’est la situation de
redéfinition (laquelle, encore une fois, sera fondamentale dans la mise en œuvre du polymorphisme), en convenant que :
Remarque
Nous verrons plus loin que certains langages autorisent une dérogation à cette règle, dans le
cas de ce que l’on nomme des valeurs de retour covariantes.
6.4 Redéfinition de méthode et dérivations successives
Comme nous l’avons dit au paragraphe 5, page 258, on peut rencontrer des arborescences
d’héritage aussi complexes qu’on le veut. Comme on peut s’y attendre, la redéfinition d’une
méthode s’applique à une classe et à toutes ses descendantes jusqu’à ce qu’éventuellement
l’une d’entre elles redéfinisse à nouveau la méthode. Considérons par exemple
Pour qu’il y ait redéfinition d’une méthode d’une classe par une classe dérivée, il faut
que la méthode possède la même signature et le même type de résultat dans la
classe dérivée que dans la classe de base.
CHAPITRE 12
262
classe Point
{ .....
méthode déplace (entier dx, entier dy) { ..... }
.....
}
classe Pointcol dériveDe Point
{ .....
méthode déplace (entier dx, entier dy, entier dc) { ..... }
.....
}
Pointcol pc
pc.déplace (3, 5)
// méthode appelée ?
Cette fois, l’instruction pc.déplace(3, 5) ne peut plus appeler la méthode déplace de
Pointcol puisqu’elle ne prévoit pas le bon nombre de paramètres. On peut alors se demander si elle va appeller la méthode déplace de Point. Autrement dit, Pointcol dispose-t-elle
de deux méthodes déplace (comme si l’on avait affaire à une surdéfinition). La réponse va
malheureusement dépendre du langage concerné et elle tient à la manière dont ce langage va
faire cohabiter ces notions (différentes) de :
• surdéfinition : plusieurs méthodes accessibles, identifiées par leur signature (revoyez
éventuellement le paragraphe 4.6 du chapitre 8, page 162) ;
• redéfinition : une seule méthode accessible à un objet de type donné : une redéfinition masque une méthode de même nom d’un ascendant...
Ici, nous ne chercherons pas à examiner de telles situations en détail (ce qui peut devenir très
complexe, et parfois un peu éloigné d’une bonne pratique de la programmation orientée
objet). Nous nous contenterons simplement de définir précisément ce qu’est la situation de
redéfinition (laquelle, encore une fois, sera fondamentale dans la mise en œuvre du polymorphisme), en convenant que :
Remarque
Nous verrons plus loin que certains langages autorisent une dérogation à cette règle, dans le
cas de ce que l’on nomme des valeurs de retour covariantes.
6.4 Redéfinition de méthode et dérivations successives
Comme nous l’avons dit au paragraphe 5, page 258, on peut rencontrer des arborescences
d’héritage aussi complexes qu’on le veut. Comme on peut s’y attendre, la redéfinition d’une
méthode s’applique à une classe et à toutes ses descendantes jusqu’à ce qu’éventuellement
l’une d’entre elles redéfinisse à nouveau la méthode. Considérons par exemple
Pour qu’il y ait redéfinition d’une méthode d’une classe par une classe dérivée, il faut
que la méthode possède la même signature et le même type de résultat dans la
classe dérivée que dans la classe de base.
