Vous êtes sur la page 1sur 23

Anne 2008-2009

Hritage et polymorphisme

Nicolas Baudru
ml : nicolas.baudru@esil.univmed.fr
page web : nicolas.baudru.perso.esil.univmed.fr

Rappel : Notion d'hritage

Cercle
tourner()
(centre)
jouerSon()

Carre
tourner()
(centre)
jouerSon()

Triangle
tourner()
(sommet)
jouerSon()

Pour ne pas dupliquer certains morceaux de code, les caractristiques communes


peuvent tre extraites et places dans une classe plus abstraite nomme Forme :
Forme
tourner()
(centre)
jouerSon()

Cercle

Carre

Triangle

Rappel : sous-classes et superclasse

Cercle

Les sous-classes Carre, Cercle et


Triangle hritent de la superclasse
Forme. Les sous-classes hritent des
mthodes de la superclasse. Ainsi il
ne reste qu'un seul exemplaire de
tourner() et jouerSon() maintenir.

Forme
tourner()
superclasse
(centre)
jouerSon()

Carre

hritent de
Triangle

sous-classes

Rappel : rednition de mthodes

Forme
tourner()
(centre)
jouerSon()

Il sut alors de rednir les


mthodes spciques lorsque cela est
ncessaire

Triangle
tourner()
(sommet)
jouerSon()
(celui propre au triangle)

Comprendre l'hritage

Lors de la conception d'une hirarchie d'hritage, vous devez placer le code


commun dans une classe (la superclasse). Puis il faut indiquer aux classes plus
spciques (les sous-classes) que la qui est la superclasse. On dit que la
sous-classe hrite de la superclasse.
En java on dit que la sous-classe tend la superclasse. Hriter d'une superclasse
signie hriter des membres (les variables d'instance et les mthodes) de la
superclasse.
La sous-classe peut si ncessaire :
ajouter des variables d'instance et des mthodes qui lui sont propres,
rednir les mthodes qu'elle hrite de la superclasse.

L'hritage en Java

MdecinDeFamille
faitDesVisites
donnerConseil()

Docteur
travailALHopital
traiterPatient()
Chirurgien
traiterPatient()
faireUneIncision()

L'hritage en Java

Docteur
travailALHopital
traiterPatient()
class Docteur {
boolean travailALHopital ;
}

void traiterPatient () {

// fait un checkup }

L'hritage en Java

Docteur
travailALHopital
traiterPatient()
MdecinDeFamille
faitDesVisites
donnerConseil()
class MedecinDeFamille extends Docteur {
boolean faitDesVisites ;
}

void donnerConseil {

...

En Java dire que MedecinDefamille hrite de Docteur se fait en utilisant le mot


cl extend.
8

L'hritage en Java

Docteur
travailALHopital
traiterPatient()
Chirurgien
traiterPatient()
faireUneIncision()
class Chirurgien extends Docteur {
void traiterPatient { // oprer
void faireUneIncision () { ... }
}

Ici, nous avons redni traiterPatient() et ajout une nouvelle mthode.


9

Questions

Quel est le nombre de variables d'instance de Chirurgien ?


Quel est le nombre de variables d'instance de MedecinDeFamille ?
Combien de mthodes Docteur a-t-il ?
Combien de mthodes MedecinDeFamille a-t-il ?
MedecinDeFamille peut-il invoquer traiterPatient() ?
MedecinDeFamille peut-il invoquer faireUneIncision ?

10

Qui fait quoi ?

Loup

Animal
emettreSon()
manger()
dormir()
vagabonder()

l = new Loup ();

l . emettreSon ();
l . vagabonder ();

Canin
vagabonder()

l . manger ();
l . dormir ();

Loup
emettreSon()
manger()
11

Concevoir correctement une hirarchie d'hritage

Il sut d'utiliser le test EST-UN(E) : si un X EST-UN Y alors il y a de grande


chance pour que X hrite (directement ou indirectement) de Y.
Exemple :
Triangle EST-UNE Forme
Chirurgien EST-UN Docteur
Loup EST-UN Animal
Loup EST-UN Canin
Canin EST-UN Animal
L'hritage est unidirectionnel. De plus chaque classe ne peut avoir qu'une
seule superclasse : c'est l'hritage simple.

12

Questions

Une superclasse peut-elle invoquer une mthode rednie dans une de ses
sous-classes ?
Une sous-classe peut-elle utiliser les mthodes de la superclasse ?

13

Hritage et niveaux d'accs

Il existe 4 niveaux d'accs en Java contrlant la visibilit des variables d'instances


et des mthodes. Du plus restrictif au plus permissif :
private

package

protected

public

Les niveaux d'accs aectent l'hritage de la manire suivante :


Les membres publics sont hrits.
Les membres privs ne sont pas hrits. (En fait les variables d'instance sont
tout de mme hrites mais ne sont pas accessibles directement).
Nous parlerons des niveaux d'accs package et protected plus tard.

14

Quand utiliser l'hritage

Utiliser l'hritage quand une classe est un type plus spcique qu'une
superclasse.
Utiliser l'hritage quand vous avez un comportement qui doit tre partag par
plusieurs classes du mme type gnral.
Ne pas utiliser l'hritage uniquement pour pouvoir rutiliser le code d'une
autre classe sans qu'il y ait de relation entre les deux classes.
Ne pas utiliser l'hritage si la sous-classe et la superclasse ne russissent pas
le test du EST-UN.

15

Avantages de l'hritage

Vous vous tes dbarrass du code dupliqu en le plaant dans une


superclasse.
Si ce code doit voluer, il sut de le mettre jour dans la superclasse. Pas
besoin de toucher aux autres classes.
Il sut de livrer la classe modie et toutes celles qui en drivent utiliseront
automatiquement la nouvelle version.
L'hritage garantit que les classes regroupes sous un certain supertype
possdent toutes les mthodes hritables de ce supertype.
Quand vous dnissez un supertype pour un groupe de classes, toute classe
de ce supertype est substituable l o ce supertype est attendu. C'est le
polymorphisme.

16

Le polymorphisme

Rappel : obtenir un objet

Chien monChien = new Chien ();


1 Dclarer une variable rfrence : Chien monChien = new Chien() ;

2 Crer un objet : Chien monChien = new Chien() ;

3 Lier l'objet et la rfrence : Chien monChien = new Chien() ;

Le point important ici est que la rfrence et l'objet sont de mme type.

17

Le polymorphisme

Le polymorphisme autorise la rfrence et l'objet tre de types dirents.


Animal monChien = new Chien ();

Avec le polymorphisme le type de la rfrence peut tre du type de la superclasse


de l'objet.
Exemple : Il est possible de crer des tableaux polymorphes.
Animal [] zoo = new Animal [3];
zoo [0] = new Chien ();
zoo [1] = new Tigre ();
zoo [2] new Singe ();
for ( int i = 0; i < zoo . length ; i ++) {
zoo [ i ]. manger ();
}

Grce l'hritage et au polymorphisme, une seule et mme mthode peut tre


utilise pour plusieurs objets de types dirents.
18

Le polymorphisme

Il est aussi posssible d'avoir des paramtres et des types de retour polymorphes.
Cela permet d'crire du code qui ne change pas lors de l'introduction de nouveaux
types de sous-classes dans le programme.
class Veto {
public void soigner ( Animal e ) {
e . emettreSon ();
}

public Animal mettreBas ( Animal e1 , Animal e2 ) {


// tester de quels animaux il s ' agit ,
// par exemple des Chiens
Chien chiot = new Chien ();
return chiot ;
}

19

Questions

Y a-t-il une limite de profondeur au sous-classement ?


Peut-on tendre n'importe quelle classe ?
Peut-on empcher le sous-classement ?
Si oui, quel en est l'intert ?
Peut-on avoir une mthode nale sans que toute la classe soit nale ?

20

Rednition vs surcharge

Lorsque vous rednissez une mthode d'une superclasse, vous devez respecter les
rgles suivantes :
les arguments et les types de retour doivent tre identiques celle de la
superclasse (en fait le type de retour peut tre le type d'une sous-classe) ;
la mthode ne peut pas tre moins accessible.
Lorsque vous surchargez une mthode (qui a pu tre hrite), vous devez
respecter les rgles suivantes :
les types de retour peuvent tre dirents ;
il n'est pas possible de ne changer que le type de retour. Il faut
imprativement modier les paramtres ;
le niveau d'accs peut varier dans les deux directions.

21

Rednition vs surcharge, et le compilateur


public class Monstre {
public boolean fairePeur ( int x ) {
System . out . println ( " arrrrg " ); return true ;
}
}
public class Vampire extends Monstre {
public boolean fairePeur ( int x ) {
System . out . println ( " je mords " );
return true ;
}
}
public class Zombi extends Monstre {
public boolean fairePeur ( byte x ){
System . out . println ( " aaaaa " );
return true ;
}
}
22

Rednition vs surcharge, et le compilateur

public class TestMonstre {


public static void main ( String [] args ) {
byte b = 0;
Monstre [] m = new Monstre [3];
m [0] = new Vampire ();
m [1] = new Zombi ();
m [2] = new Monstre ();
for ( int i = 0; i < m . length ; i ++)
{
m [ i ]. fairePeur ( i );
}
}
}

23

Vous aimerez peut-être aussi