Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Cet article est une reprise de l'article Vision ensembliste de l'héritage que j'avais précédemment publié sur http://wiki.esicom-st-malo.fr

L'héritage est un concept fondamental de la programmation orientée objets parfois difficile à saisir pour les débutants. Cet article vient en complément de l'article encapsulation, héritage et polymorphisme et présente l'héritage sous le jour de la théorie des ensembles.


Considérons pour l'exemple les animaux d'un zoo. Il y a:

Tous ces animaux peuvent être groupés dans différents ensembles comme sur la représentation graphique ci-dessous:

Chacun de ces ensembles forme une classe (au sens de la théorie des ensembles) car ils sont constitués de tous les éléments qui partagent une ou plusieurs caractéristique(s) commune(s) - ici, leur "espèce".

Note:

D'où l'utilisation du terme classe en programmation orientée objets.

Vous remarquerez également que certains ensembles sont inclus les uns dans les autres. Ainsi, l'ensemble des "Loups" est inclus dans l'ensemble des "Mammifères", lui même inclus dans l'ensemble des "Animaux". Dans le vocabulaire de la théorie des ensembles, on dit que la classe des "Loups" est une sous-classe de la classe des "Mammifères". Et la classe des "Animaux" est une super-classe à la fois des "Mammifères" et des "Reptiles".

Note:

D'où le mot-clé Java super et l'utilisation de sous-classe et super-classe comme synonymes de classe dérivée et classe de base.

Il est également possible de représenter ces relations dans un diagramme de classes (notation UML). Vous constaterez alors que la relation d'héritage recouvre exactement la relations d'inclusion!

La hiérarchie de classes représentée graphiquement ci-dessus pourrait être formalisée en utilisant la syntaxe de Java ainsi:

class Animaux {}
class Mammiferes extends Animaux {}
class Loups extends Mammiferes {}
class Elephants extends Mammiferes {}
class Reptiles extends Animaux {}
class Cobras extends Reptiles {}
class Tortues extends Reptiles {}
class Crocodiles extends Reptiles {}

La syntaxe des langages est parfois contre-intuitive!

Contrairement à ce que pourrait laisser supposer le terme extends, la notation suivante:

class Mammifères extends Animaux {}

Signifie que les Mammifères forment un sous-ensemble des Animaux, pas le contraire!

En fait, le mot clé extends a été choisi en Java, non pas par rapport aux ensembles, mais par rapports au caractéristiques des membres de ces ensembles: puisque Mammifères ≤ Animaux, et par définition même de la notion de classe, les "Mammifères" ont plus de choses en communs entre-eux qu'avec les autres "Animaux". Ils "étendent" donc la classe des "Animaux" en ajoutant les caractéristiques spécifiques aux "Mammifères".

Remarque:

Rien n'oblige tous les ensembles à être inclus les uns dans les autres: on pourrait très bien imaginer de grouper également les animaux en classes selon leur nombre de pattes. Dans ce cas, les "Tortues" formeraient une sous-classe des "Reptiles", mais aussi des "Quadrupèdes". Cette possibilité pourrait être mise en œuvre dans des langages qui proposent l'héritage multiple comme le C++.

Dans les langages qui ne proposent que l'héritage simple (comme Java), il serait nécessaire de choisir un de ces deux modèles: soit groupement en "espèces", soit par "nombre de pattes".