Vous êtes sur la page 1sur 29

CHAPITRE V

POO: HERITAGE

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

On a parfois besoin de dfinir un type dobjet similaire un type existant, avec quelques proprits supplmentaires. Lhritage permet de dfinir ce nouveau type sans tout reprogrammer. Une classe fille qui drive (on dit qui tend en Java) d'une seule classe mre, hrite de sa classe mre toutes ses mthodes et tous ses champs(Sauf ceux dclars priv).

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

Vision ensembliste

Vision hirarchique

Animaux
Mammifres Oiseaux

Animal Chiens Oiseau Mammifre

Chats

Chat
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

Chien
3

En Java la syntaxe de l'hritage fait intervenir le mot clef extends, Une dclaration du type : class ClasseFille extends ClasseMere { }

On se propose de spcialiser la gestion des comptes. On cre alors une classe CompteChque et une autre classe CompteEpargne qui drivent de la classe CompteBancaire. public class CompteBancaire{..} public class CompteCheque extends CompteBancaire {..} public class CompteEpargne extends CompteBancaire {..}

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

CompteBancaire
solde
drivation deposer ( ) retirer ()

champs

mthodes

CompteEpargne CompteCheque
decouvertAutorise
changeDecouvert ( ) retirer ( )

taux interets
calculInterets( ) crediterInterets( ) changerTaux( )

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

Ce mot clef super rfrence la classe mre et travers lui, il est possible d'accder tous les champs et toutes les mthodes de la super-classe (classe mre).

Au dbut du corps dun constructeur de la classe drive, on peut appeler explicitement un constructeur de la classe de base avec les paramtres souhaits grce la notation : super(paramtres)

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

Supposons disposer dune classe CompteBancaire: package 1; public class CompteBancaire { double solde ; CompteBancaire (double solde ) { this.solde = solde; } void deposer ( double montant) { solde +=montant; } void retirer (double montant) { if (solde >=montant ) solde -=montant ; } }

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

package1; public class CompteCheque extends CompteBancaire { CompteCheque (double solde, double decouvertAutorise) { super (solde); this.decouvertAutorise = decouvertAutorise; } void retirer (double montant) // methode redefinie { if (solde + decouvertAutorise >=montant) solde -=montant ; } }

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

package 1; public class CompteEpargne extends CompteBancaire {

CompteEpargne (double solde, double taux) { super (solde); this. taux = taux; } }

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

package 1; class CompteBancaire { double solde ; // void retirer (double montant) { if (solde >=montant ; solde -=montant ; } void imprimeHistorique( ) { System.out.print (" solde =" +solde ); }

package 1;

class CompteCheque extends CompteBancaire {


double decouvertAutorise; // methode redefinie void retirer (double montant) { if (solde + decouvertAutorise>=montant) solde -=montant ; } void imprimeHistoriqueCheque( ) { System.out.print (" solde =" +solde + " " + "decouvertAutorise=" +decouvertAutorise); } }
Mme. KASSE Master I UCAD Mme. KASSE

Master I UCAD

10

Avec : CompteBancaire cb; CompteCheque cc; lappel : cb.retirer ( 20000); appelle la mthode retirer de CompteBancaire. lappel : cc.retirer ( 20000); appelle la mthode retirer de CompteCheque. On se base tout simplement sur le type de lobjet pour dterminer la classe de la mthode appele. Pour bien voir lintrt de la redfinition des mthodes, examinons la Mthode imprimeHistorique de la classe CompteBancaire qui permet dafficher le solde pour un compte et la mthode imprimeHistoriqueCheque de la classe CompteCheque qui affiche non seulement le solde (qui est un membre hrit) mais aussi le decouvertAutorise. Dans cette dernire, il y a une information qui est dj prise en compte dans la mthode imprimeHistorique. La situation prcdente peut tre amliore de cette faon:
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

11

package 1; package 1; class CompteBancaire { double solde ; // void retirer (double montant) { if (solde >=montant ) solde -=montant ; } void imprimeHistorique( ) { System.out.print (" solde =" +solde ); } class CompteCheque extends CompteBancaire {

double decouvertAutorise; // methode redefinie void+ retirer (double montant) { if (solde decouvertAutorise >=montant ) solde -=montant ; } void imprimeHistoriqueCheque( ) {
imprimeHistorique( ); System.out.print (" et le decouvertAutorise =" +decouvertAutorise); }}
Mme. KASSE Master I UCAD Mme. KASSE

Master I UCAD

12

package1;

package1;

class CompteBancaire { double solde ; //


void retirer (double montant) { if (solde >=montant ; solde -=montant ; }

class CompteCheque extends CompteBancaire {


double decouvertAutorise; // methode redefinie void retirer (double montant) { if (solde + decouvertAutorise >=montant ; solde -=montant ; } {

void imprimeHistorique( )
{ System.out.print (" solde =" +solde ); } super obligatoire.

void imprimeHistorique( )

super.imprimeHistorique( );
System.out.print (" et le decouvertAutorise =" +decouvertAutorise); } }
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

13

package 1; class Calcul { public double division ( int a) { // instructions } }

Calcul c; Calcul11 c11; int n; float p; c.division (n); c.division (p); c11.division (n);

class Calcul11 exends Calcul { public float division ( float a)


{ // instructions } }

c11.division (p);

La recherche dune mthode acceptable ne se fait quen remontant la hirarchie dhritage, jamais en la descendant. Cest pourquoi lappel c.division (p); ne peut tre satisfait.
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

14

En cas de redfinition, Java impose seulement lidentit des signatures mais aussi du type de la valeur de retour
package allndong.compte; class CompteBancaire { double solde ; // void retirer (double montant) { if (solde >=montant ; solde -=montant ; }} package allndong.compte; class CompteCheque extends CompteBancaire { double decouvertAutorise; // methode redefinie void retirer (double montant) { if (solde + decouvertAutorise >=montant ; solde -=montant ; } }

Valeurs de retour identiques


Mme. KASSE

Signatures identiques
Master I UCAD Mme. KASSE Master I UCAD

15

La redfinition dune mthode ne doit pas mthode. Par contre, elle peut les augmenter.

diminuer les droits daccs cette

class A { public void f ( int n){} } class B extends A {// impossible de mettre private

class A { private void f ( int n){} } class B extends A {// augmente les droits d acces: possible

private void f ( int n) {.}


}

public void f ( int n) {.}


}

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

16

Si une mthode dune clase drive a la mme signature quune mthode dune classe ascendante : Dans les autres cas, cest--dire lorsquune les valeurs de retour des deux mthodes doivent mthode dune classe tre exactement de mme type, drive a le mme nom le droit daccs de la mthode de la classe drive quune mthode dune ne doit pas tre moins lev que celui de la classe classe ascendante, avec une signature diffrente, ascendante, on a affaire une la clause throws de la mthode de la classe surdfinition . drive ne doit pas mentionner des exceptions non mentionnes dans la clause throws de la mthode de la classe ascendante(la clause throws sera tudie ultrieurement). Si ces trois conditions sont remplies, on a affaire une redfinition. Sinon, il sagit dune erreur.
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

17

Un langage orient objet est dit polymorphique, sil offre la possibilit de pouvoir percevoir un objet en tant quinstance de classes varies, selon les besoins. Le surclassement et la liaison dynamique (ligature dynamique) servent mettre en uvre le polymorphisme.

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

18

Une classe B qui hrite de la classe A peut tre vue comme un sous-type du type dfini par la classe A. On parle de surclassement ou upcasting si : une rfrence dclare de type A il est possible daffecter une valeur qui est une rfrence vers un objet de type B (surclassement ou upcasting)

Exemple:
CompteBancaire cb; cb = new CompteCheque( 100000, 50000 ); A la compilation Lorsquun objet est surclass , il est vu par le compilateur comme un objet du type de la rfrence utilise pour le dsigner Ses fonctionnalits sont alors restreintes celles proposes par la classe du type de la rfrence
Mme. KASSE Master I UCAD Mme. Mme. KASSE KASSE Master I UCAD

19

CompteBancaire
solde deposer ( ) retirer ()

CompteCheque cc = new CompteCheque(100,50);

CompteBancaire cb;

cb = cc; // surclassement
cb.retirer (50); cc.retirer( 25); cb.deposer (500); cc.deposer ( 250);

CompteCheque
decouvertAutorise
changeDecouvert ( )

cb.changedecouvert ( );
cc.changeDecouvert( );

retirer ( )

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

20

A lexcution Lorsquune mthode dun objet est accde au travers dune rfrence surclasse , cest la mthode telle quelle est dfinie au niveau de la classe effective de lobjet qui est invoque et excute. La mthode excuter est dtermine lexcution et non pas la compilation. On parle de lien dynamique. la mthode excuter est dtermine lexcution (run time) et non pas la compilation . la mthode dfinie pour le type rel de lobjet recevant le message est appele et non pas celle dfinie pour son type dclar . Exemple CompteBancaire cb = new CompteCheque (500,100);
Type dclar
Mme. KASSE Master I UCAD Mme. KASSE

Type rel
Master I UCAD

21

CompteBancaire

CompteCheque

void retirer (double montant) void retirer (double montant) { if (solde >=montant) {if (solde + decouvertAutorise >=montant ; solde -=montant ; solde -=montant ; } } CompteBancaire cb = new CompteCheque (500,100); cb.retirer ( 50);

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

22

En Java, une classe peut annoncer une mthode sans la dfinir. Une telle classe est dite abstraite. Le but est davoir des modles gnriques permettant de dfinir ultrieurement des actions spcifiques.
3 rgles retenir

Si une seule des mthodes dune classe est abstraite, alors la classe devient aussi abstraite. Une mthode abstraite n'est qu'une signature de mthode sans implmentation dans la classe. On ne peut pas instancier une classe abstraite car au moins une de ses mthodes na pas dimplmentation. Toutes les classes filles hritant de la classe mre abstraite doivent implmenter toutes ses mthodes abstraites ou sinon elles sont aussi abstraites.
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

23

On dfinit une classe abstraite en Java en utilisant le mot cl abstract devant le nom de la classe:
abstract class A { ... abstract void P(); ... void Q() {...} } class B extends A { ... void P(){...} ... void Q() {...} }

Dans cet exemple, la classe A annonce mais ne dfinit pas la mthode P. Cest une classe abstraite. La classe drive B dfinit P et redfinit Q.

Une classe abstraite nayant pas toutes ses mthodes dfinies, il est interdit de crer des objets de ce type. A a = new A( ) ; //interdit
Mme. KASSE Master I UCAD Mme. KASSE Master I UCAD

24

Comme exemple simple, on peut considrer diverses catgories de figures : les cercles, les rectangles etc.. Figure
orig Perimtre( ); ?

Cercle
rayon

Rectangle
Lx Ly Perimtre( ) 2*(Lx+Ly)

Les diverses espces de figures sont ralises sous forme de classes hritires de Figure et chacune dfinit une version de la fonction primtre() :

Perimtre( )
2**rayon

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

25

abstract class Figure { abstract double perimetre(); }

class Cercle extends Figure { private static final double pi=3.141592; double rayon; Cercle(double r) { rayon=r;} double perimetre() {return 2*pi*rayon;} } class Rectangle extends Figure {double LX, LY; Rectangle(double lx,double ly) { LX=lx; LY=ly;} double perimetre() {return 2*(LX+LY);} }
Master I UCAD Mme. KASSE Master I UCAD

Forme f =new Circle(2); Forme f =new Rectangle(2,3);

Mme. KASSE

26

Le langage Java ne permet pas de l'hritage multiple . Pour supprimer les problmes lis l'hritage multiple, les interfaces sont des sortes de classes qui ne possdent que des champs static final (autant dire des constantes) et des mthodes abstraites. Une classe peut implmenter ( implements) une ou plusieurs interfaces tout en hritant (extends) d'une classe. Une interface peut hriter (extends) de plusieur (s) interface(s).

Les interfaces ne sont pas instanciables (Mme raisonnement avec les classes abstraites)
NomInterface jeTente = new NomInterface(); // Erreur!!

Mme. KASSE

Master I UCAD Mme. KASSE

Master I UCAD

27

interface Service { int MAX = 1024 ; int une_mthode(...) ;} Dans la dfinition dune interface seuls les droits daccs public et le droit de paquetage (vide) sont autoriss. package 1; interface Operation { /*constantes*/ public final double nombre =100 ; float x = 1000; /* que des methodes abstraites*/ public double addition( ); public float division( ); double multiplication ( ); }
Mme. KASSE Master I UCAD Mme. KASSE

Master I UCAD

28

Une contrainte dans limplmentation dune interface: il faut obligatoirement redfinir toutes les mthodes de linterface

package 1; abstract class Forme{ public abstract double perimetre( ) ; } interface Dessinable{public void dessiner();} class Circle extends Forme implement Dessinable {private double r; public double perimetre ( ) { return 2 * Math.PI * r ; } void dessiner ( ){ //instructions de dessin d un cercle} } class Rectangle extends Forme implement Dessinable { private double long, larg; public double perimetre( ) { return 2 * (long + larg); } void dessiner ( ){ //instructions de dessin d un rectangle} } Dessinable dessins = new Circle (2); Dessinable dessins =new Rectangle(2,3),
Mme. KASSE Master I UCAD Mme. KASSE

Master I UCAD

29