Vous êtes sur la page 1sur 13

Programmation Oriente Objet : Langage Java

Rutilisation

Pour raccourcir les temps dcriture et de mise au


point du code dune application, il est intressant de

Hritage

2013-2014

284

pouvoir rutiliser du code dj utilis

SMI /SBDR/FSAC

Rutilisation par des classes clientes

286

SMI /SBDR/FSAC

SMI /SBDR/FSAC

Rutilisation avec modifications

Soit une classe A dont on a le code compil


Une classe C veut rutiliser la classe A
Elle peut crer des instances de A et leur demander
des services
On dit que la classe C est une classe cliente de la
classe A

2013-2014

285

2013-2014

On peut souhaiter modifier en partie le comportement


de A avant de la rutiliser :
le comportement de A convient, sauf pour des dtails quon
aimerait changer
on aimerait ajouter une nouvelle fonctionnalit A

2013-2014

287

SMI /SBDR/FSAC

Rutilisation avec modifications du code source

Rutilisation par lhritage

Lhritage existe dans tous les langages objet classes

On peut copier, puis modifier le code source de A

Lhritage permet dcrire une classe B

dans des classes A1, A2,...

qui se comporte dans les grandes lignes comme la classe A

Problmes :

mais avec quelques diffrences sans toucher ni copier le code source de A

code source de A pas toujours disponible

On a seulement besoin du code compil de A

les amliorations futures du code de A ne seront pas dans les

classes A1, A2, (et rciproquement) ; difficile maintenir !

288

2013-2014

SMI /SBDR/FSAC

289

2013-2014

Rutilisation par lhritage

SMI /SBDR/FSAC

Vocabulaire

Le code source de B ne comporte que ce qui a

La classe B qui hrite de la classe A sappelle une


classe fille ou sous-classe

chang par rapport au code de A

On peut par exemple

La classe A sappelle une classe mre, classe parente


ou super-classe

ajouter de nouvelles mthodes


modifier certaines mthodes

2013-2014

290

SMI /SBDR/FSAC

2013-2014

291

SMI /SBDR/FSAC

Exemple dhritage - classe mre

Exemple dhritage - classe fille

public class Rectangle {


private int x, y; // sommet en haut gauche
private int largeur, hauteur;
// La classe contient des constructeurs,
// des mthodes getX(), setX(int)
// getHauteur(), getLargeur(),
// setHauteur(int), setLargeur(int),
// contient(Point), intersecte(Rectangle)
// translateToi(Vecteur), toString(),...
. . .
public void dessineToi(Graphics g) {
g.drawRect(x, y, largeur, hauteur);
}
}

292

2013-2014

public class RectangleColore extends Rectangle {


private Color couleur; // nouvelle variable
// Constructeurs
. . .
// Nouvelles Mthodes
public Color getCouleur() { return this.couleur; }
public void setCouleur(Color c) {this.couleur = c; }
// Mthode modifie
public void dessineToi(Graphics g) {
g.setColor(couleur);
g.fillRect(getX(), getY(),
getLargeur(), getHauteur());
}
}

SMI /SBDR/FSAC

2013-2014

293

Code des classes filles

SMI /SBDR/FSAC

Exemples dhritages

Quand on crit la classe RectangleColore, on doit

Classe mre Vehicule, classes filles Velo, Voiture et Camion

seulement

Classe Avion, classes mres ObjetVolant et ObjetMotorise

crire le code (variables ou mthodes) li aux nouvelles possibilits ; on

Classe Polygone hrite de la classe FigureGeometrique

ajoute ainsi une variable couleur et les mthodes qui y sont lies

Classe Image, classes filles ImageGIF et ImageJpeg

redfinir certaines mthodes ; on redfinit la mthode dessineToi()

2013-2014

294

SMI /SBDR/FSAC

2013-2014

295

SMI /SBDR/FSAC

2 faons de voir lhritage

Particularisation-gnralisation :

Chaque langage objet a ses particularits

un polygone est une figure gomtrique, mais une figure gomtrique

particulire

Par exemple,
C++ et Eiffel permettent lhritage multiple ;

la notion de figure gomtrique est une gnralisation de la notion de

C# et Java ne le permettent pas

polygone

Une classe fille offre de nouveaux services ou enrichit les

A partir de ce point on dcrit lhritage dans le

services rendus par une classe : la classe RectangleColore

langage Java

permet de dessiner avec des couleurs et pas seulement en


noir et blanc

296

2013-2014

SMI /SBDR/FSAC

2013-2014

297

Lhritage en Java

SMI /SBDR/FSAC

Exemples dhritages

En Java, chaque classe a une et une seule classe mre (pas

class Voiture extends Vehicule

dhritage multiple) dont elle hrite les variables et les

class Velo extends Vehicule

mthodes

class VTT extends Velo


Le mot clef extends indique la classe mre :

class Employe extends Personne

class RectangleColore extends Rectangle

class ImageGIF extends Image

Par dfaut (pas de extends dans la dfinition dune classe),

class PointColore extends Point

une classe hrite de la classe Object

class Polygone extends FigureGeometrique

2013-2014

298

SMI /SBDR/FSAC

2013-2014

299

SMI /SBDR/FSAC

Ce que peut faire une classe fille

Principe important li la notion dhritage

Si B extends A , le grand principe est que tout B est un A

La classe qui hrite peut

Par exemple:

ajouter des variables, des mthodes et des constructeurs


redfinir des mthodes (mme signature)

un rectangle color est un rectangle ;

surcharger des mthodes (mme nom mais pas mme signature)

un poisson est un animal ;

une voiture est un vhicule

Mais elle ne peut retirer aucune variable ou mthode

En Java, on vitera dutiliser lhritage pour rutiliser du


code dans dautres conditions

300

2013-2014

SMI /SBDR/FSAC

301

2013-2014

Types en Java

SMI /SBDR/FSAC

Sous-type

Le type dune variable dtermine les donnes que la

B est un sous-type de A si on peut ranger une expression


de type B dans une variable de type A

variable peut contenir/rfrencer

Les sous-classes dune classe A sont des sous-types de A

Le type dune expression dcrit la forme du rsultat du


calcul de lexpression

En effet, si B hrite de A, tout B est un A donc on peut


ranger un B dans une variable de type A

Par exemple, si x et y sont des int, x + y est de type

int

Par exemple,

Les types en Java : types primitifs, tableaux, numrations

A a = new B();

et classes

est autoris

On verra aussi les interfaces et les types gnriques

2013-2014

302

SMI /SBDR/FSAC

2013-2014

303

SMI /SBDR/FSAC

Programmation Oriente Objet : Langage Java

Lhritage en notation UML

Uniquement les
lments ajouts
ou modifis par la
classe fille

Complments sur les


constructeurs dune classe

304

2013-2014

SMI /SBDR/FSAC

2013-2014

1re instruction dun constructeur

SMI /SBDR/FSAC

Constructeur de la classe mre

public class Rectangle {


private int x, y, largeur, hauteur;
public Rectangle(int x, int y, int largeur, int hauteur) {
this.x = x;
this.y = y;
this.largeur = largeur;
this.longueur = longueur;
}
. . .
}

La premire instruction dun constructeur peut tre un


appel
un constructeur de la classe mre :

super(...)
ou un autre constructeur de la classe :

this(...)

305

Interdit de placer this() ou super() ailleurs quen

premire instruction dun constructeur

2013-2014

306

SMI /SBDR/FSAC

2013-2014

307

SMI /SBDR/FSAC

Appel implicite du constructeur de la classe mre

Constructeurs de la classe fille

public class RectangleColore extends Rectangle {


private Color couleur;
public RectangleColore(int x, int y, int largeur, int hauteur
Color couleur) {
super(x, y, largeur, hauteur);
this.couleur = couleur;
}
public RectangleColore(int x, int y,int largeur, int hauteur)
{
this(x, y, largeur, hauteur, Color.black);
}
. . .
}

308

2013-2014

SMI /SBDR/FSAC

Si la premire instruction dun constructeur nest ni


super(...), ni this(...), le compilateur ajoute

au dbut un appel implicite super()au constructeur


sans paramtre de la classe mre (erreur de
compilation sil nexiste pas !)

Un constructeur de la classe mre est toujours

excut avant les autres instructions du constructeur

2013-2014

Toute premire instruction excute par un constructeur

309

SMI /SBDR/FSAC

Complment sur le constructeur par dfaut dune classe

Mais la premire instruction dun constructeur de la

Ce constructeur par dfaut nappelle pas

classe mre est lappel un constructeur de la classe

explicitement un constructeur de la classe mre

grand-mre , et ainsi de suite...


Donc la toute, toute premire instruction qui est

un appel du constructeur sans paramtre de la classe

excute par un constructeur est le constructeur

mre est automatiquement effectu

(sans paramtre) de la classe Object !


(Cest le seul qui sait comment crer un nouvel objet
en mmoire)

2013-2014

310

SMI /SBDR/FSAC

2013-2014

311

SMI /SBDR/FSAC

Question

class A {
private int i;
A(int i) {
this.i = i;
}
}

Exemples de constructeurs (1)

import java.awt.*; // pour


public class Cercle {
// Constante
public static final double
// Variables
private Point centre;
private int rayon;
// Constructeur
public Cercle(Point c, int
centre = c;
rayon = r;
}

Compile ?
Sexcute ?

class B extends A { }

2013-2014

312

SMI /SBDR/FSAC

2013-2014

Exemples de constructeurs (2)

314

SMI /SBDR/FSAC

PI = 3.14;

Plus de constructeur sans


paramtre par dfaut !
r) {
Appel implicite du
constructeur Object()

313

SMI /SBDR/FSAC

Exemples de constructeurs (3)

public class CercleColore extends Cercle {


private String couleur;
public CercleColore(Point p, int r, String c) {
super(p, r);
Que se passe-t-il si on
couleur = c;
enlve cette instruction ?
}
public void setCouleur(String c) {
couleur = c;
}
public String getCouleur() {
return couleur;
}
}

// Mthodes
public double surface() {
return PI * rayon * rayon;
}
public Point getCentre() {
return centre;
}
public static void main(String[] args) {
Point p = new Point(1, 2);
Cercle c = new Cercle(p, 5);
System.out.println("Surface du cercle:"+c.surface());
}
}

2013-2014

classe Point

2013-2014

315

SMI /SBDR/FSAC

Une erreur de dbutant !

Hritage problme daccs

public class Animal {


String nom; // pas private ; suivre...
public Animal() {
}
public Animal(String unNom) {
nom = unNom;
}
public void setNom(String unNom) {
nom = unNom;
}
public String toString() {
return "Animal " + nom;
}
}

public class CercleColore extends Cercle {


private Point centre;
private int rayon;
private String couleur;
public CercleColore(Point p, int r, String c) {
centre = c;
rayon = r;
centre et rayon
couleur = c;
sont hrits de Cercle ;
}
ne pas les redclarer !

2013-2014

316

SMI /SBDR/FSAC

2013-2014

Hritage problme daccs

318

SMI /SBDR/FSAC

Rsoudre un problme daccs

public class Poisson extends Animal {


private int profondeurMax;
public Poisson(String nom, int uneProfondeur) {
this.nom = nom; // Et si nom est private ?
profondeurMax = uneProfondeur;
}
public void setProfondeurMax(int uneProfondeur) {
profondeurMax = uneProfondeur;
}
public String toString() {
return "Poisson " + nom + " ; plonge jusqu "+
profondeurMax + " mtres";
}
}

2013-2014

317

public class Poisson extends Animal {


private int profondeurMax;
public Poisson(String unNom, int uneProfondeur) {
super(unNom); // convient mme si nom est private
profondeurMax = uneProfondeur;
}
public void setProfondeurMax(int uneProfondeur) {
profondeurMax = uneProfondeur;
Accesseur obligatoire
}
si nom est private
public String toString() {
return "Poisson " + getNom()
+ " plonge jusqu " + profondeurMax
+ " mtres";
}
}

SMI /SBDR/FSAC

2013-2014

319

SMI /SBDR/FSAC

Appel dune mthode dinstance en argument dun constructeur

this et constructeurs

this existe ds que lobjet a t cr par le constructeur de la

new Classe(traitement(), ) est interdit depuis une autre classe

classe Object

Si traitement est une mthode dinstance de la classe Classe, le code

this nexiste pas avant, dans la remonte vers le constructeur de

Exemple (calculePrix est une mthode dinstance de la classe Lot) :

new Lot(calculePrix(article), article);

la classe Object

Pratiquement, this existe au retour du premier appel super()

2 manires interdites de rsoudre le problme :


int v = traitement();

ou this(), mais pas avant

this(v, ); // ou super(v, );

Ainsi this ne peut tre utilis (explicitement ou implicitement)

this(traitement(), );

dans les paramtres de super() ou de this()

On ne peut donc pas faire un appel une mthode dinstance

dans les arguments passs super() ou this()

320

2013-2014

SMI /SBDR/FSAC

2013-2014

321

SMI /SBDR/FSAC

Programmation Oriente Objet : Langage Java

Rsoudre ce problme

Revoir la conception ; souvent la meilleure solution, mais a nest pas


toujours possible :
Ne pas mettre de constructeur de Lot qui ncessite la donne du prix du
lot ; pas de variable prix dans Lot ; la mthode getPrix() calcule le prix
quand on le demande

Accs aux membres hrits


Protection protected

Utiliser un autre constructeur et faire lappel la mthode dinstance dans


le constructeur
this(article); // autre constructeur
prix = calculePrix(article);

Utiliser une mthode static (pas dutilisation de this implicite dans les
paramtres du constructeur) si cest un traitement qui nest pas li une
instance particulire

2013-2014

322

SMI /SBDR/FSAC

2013-2014

323

SMI /SBDR/FSAC

De quoi hrite une classe ?

Protection protected

Si une classe B hrite de A (B extends A), elle hrite

automatiquement et implicitement de tous les membres de

protected joue sur laccessibilit des membres


(variables ou mthodes) par les classes filles

la classe A

Les classes filles de A ont accs aux membres

Cependant la classe B peut ne pas avoir accs certains

protected de la classe A ; les autres classes non

membres dont elle a implicitement hrit (par exemple, les

filles de A ny ont pas accs

membres private)
Ces membres sont utiliss pour le bon fonctionnement de
B, mais B ne peut pas les nommer ni les utiliser

explicitement

2013-2014

324

SMI /SBDR/FSAC

2013-2014

Exemple dutilisation de protected

326

SMI /SBDR/FSAC

SMI /SBDR/FSAC

protected et paquetage

public class Animal {


Note : il est dconseill
protected String nom;
dutiliser des variables protected
. . .
}
public class Poisson extends Animal {
private int profondeurMax;
public Poisson(String unNom, int uneProfondeur)
{
nom = unNom; // utilisation de nom
profondeurMax = uneProfondeur;
}

2013-2014

325

En plus, protected autorise lutilisation par les


classes du mme paquetage que la classe o est

dfini le membre ou le constructeur

2013-2014

327

SMI /SBDR/FSAC

Prcision sur protected

Prcision sur protected (2)

Soit m un membre dclar dans la classe A et daccs


protected ;
soit b1 une instance de B, classe fille de A
b1 a accs

Attention, protected joue donc sur


laccessibilit par B du membre m hrit (B comme sous-classe de A)
mais pas sur laccessibilit par B du membre m des instances de A (B
comme cliente de A)

b1.m (sous la forme m ou this.m)


b2.m o b2 est une instance de B (la granularit de protection
est la classe) ou dune sous-classe de B

Mais b1 na pas accs


a.m o a est une instance de A

2013-2014

328

SMI /SBDR/FSAC

329

2013-2014

Exemple dutilisation de protected

Pour tre tout fait prcis avec protected

class A {
. . .
protected int m() { . . . }
}
class B extends A {
. . .
public int m2() {
int i = m(); // toujours autoris
A a = new A();
i += a.m(); // pas toujours autoris
. . .
}

330

Du code de B peut accder un membre protected de A


(mthode m() ci-dessous)

mais pas

dans une instance de B ou dune sous-classe C de B

dune instance dune autre classe (par exemple, de la classe est A ou dune
autre classe fille D de A) ;

voici du code de la classe B :


A a = new A(); // A classe mre de B
B b = new B();
C c = new C(); // C sous-classe de B
D d = new D(); // D autre classe fille de A
a.m(); // interdit
b.m(); // autoris
c.m(); // autoris
d.m(); // interdit

a dpend de quoi ?

2013-2014

SMI /SBDR/FSAC

SMI /SBDR/FSAC

2013-2014

331

SMI /SBDR/FSAC

Toutes les protections daccs

Protections des variables

Les diffrentes protections sont donc les suivantes

On sait que, sauf cas exceptionnel, les variables doivent tre


dclares private

(dans lordre croissant de protection) :

Public

On peut ajouter quon peut quelquefois dclarer une variable


protected, pour autoriser la manipulation directe par les futures

Protected

classes filles

package (protection par dfaut)

Private

Mais il est prfrable de lviter, car cela nuit lencapsulation

dune classe mre par rapport ses classes filles

protected est donc moins restrictive que la

Pas ce problme avec les mthodes protected

protection par dfaut !

2013-2014

332

SMI /SBDR/FSAC

protected et constructeur

Si un constructeur de A est dclar protected,


ce constructeur peut tre appel depuis un constructeur d'une
classe fille B par un appel super()
mais B ne peut crer dinstance de A par new A()

(sauf si B est dans le


mme paquetage que A)

2013-2014

334

SMI /SBDR/FSAC

2013-2014

333

SMI /SBDR/FSAC