Un des concepts fondamentaux de la programmation orientée objets
est la possibilité de définir une hiérarchie de types/classes.
Les expressions suivantes expriment la même idée et correspondent
à une définition en Java d'une classe Y, sous la forme
class Y extends X { . . . . . } {
............
}
|
Y est une sous-classe (directe)
de X ;Y est une extension directe de la classe >XX est la super-classe ou classe mère de la classe Y ;Y hérite ou dérive directement de Y.
Une des caractéristiques de Java, qui le distingue du langage C++, est
qu'une classe ne peut pas être sous-classe directe que d'une seule autre.
On dit que
l'héritage y est simple alors que dans C++ on parle
d'héritage multiple.
Si en Java une classe ne peut hériter directement que d'une seule autre,
il est cependant possible pour une classe Y
d'hériter indirectement d'une classe X
au travers d'une chaîne d'héritages comme dans
class Y extends Xn { . . . . . }
class Xn extends Xn-1 { . . . . . }
. . . . . . . . .
class X2 extends X1 { . . . . . }
class X1 extends X { . . . . . }
|
La notion de sous-classe est ainsi transitive.
On définit ainsi une hiérarchie de classes dont la
classe Object constitue la racine et dont toute nouvelle classe sera une
sous-classe.
La définition d'une sous-classe permet, bien évidemment, tout d'abord
de récupérer dans la sous-classe
tous les attributs de la classe mère (variables et méthodes). Toute instance
de la classe fille encapsulera une instance de la classe mère.
Ces différents membres y seront accessibles
à moins que dans la classe mère ils y soient qualifiés de
private ou qu'ils soient redéfinies
dans cette classe fille.
Mais cette fonctionnalité permet plus :
Il est ainsi possible de définir une classe C regroupant un ensemble d'objets dotés d'attributs et de méthodes communes, puis de définir parmi les objets de cette classe des sous-classes Ci regroupant chacune des objets de la classe C possédant tous des attributs spécifiques (variables ou méthodes) les distinguant des autres instances de C.
A titre d'exemple, on peut imaginer de
InstrumentDeMusique dont les
instances seraient des instruments de musique. Des variables d'instance
de la classe permettraient par exemple de définir particulière la note la plus
basse et la note la plus haute ou la tonalité
d'une instance (un instrument) particulière ;InstrumentACordes ou
InstrumentAVent permettant la
définition de caractéristiques spécifiques à chacune de ces catégories.
Bois et
Cuivres
et pourquoi pas une sous-classe des instruments à anches raffinant celle des bois
(encore qu'il existe des instruments à anches tels que
la cornemuse non classés dans les bois et là l'héritage multiple serait utile)
Anches possédant des attributs définissant par exemple
le nombre d'anches de l'instrument (une pour un hautbois ou une clarinette,
4 pour une cornemuse) ou le type d'anche (simple pour la clarinette, double pour
le hautbois ou le basson, ...) qui sont hors propos quand on s'intéresse
à un instrument à embouchure tel que la trompette ou le cor.À partir de cette notion de sous-classe, on introduit la relation de sous-typage et on note T ← ST le fait que le type ST soit un sous-type du type T :
Une propriété essentielle du mécanisme est que
|
si ST est un sous-type de T, alors toute valeur du type ST peut être utilisée en lieu et place d'une valeur de type T |
ce qui autorise la réealisation de transtypages impicites(«upcasting»).