Hiérarchisation des classes et héritage

Introduction

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 {  . . . . . } {    
             ............
   }
la classe X étant supposée définie par ailleurs :

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.


À quoi cela sert-il ?

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

Des méthodes spécifiques peuvent aussi s'appliquer à certains instruments mais pas à d'autres (mettre une sourdine, émettre plusieurs sons simultanément, ...)

Hiérarchie des types et sous-typage

À 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 :

  • la relation est réflexive: pour tout type T on a T ← T ;
  • si la classe SC est une sous-classe de C, on a C ← SC ;
  • si l'interface SI est une sous-interface de I, on a I ← SI ;
  • si la classe C implante l'interface I, on a I ← C ;
  • si T ← ST, alors T [ ] ← ST [ ] ;
  • si ST ← SST et T ← ST, alors T ← SST (transitivité de la relation).

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»).



Dernière mise à jour : 16 juin 2005

Valid XHTML 1.0! Valid CSS!