Cours5 Heritage
Cours5 Heritage
Cours5 Heritage
Cours 5 : lhritage
Cours inspir des cours de Richard Grin, Antoine Tabbone et Hazel Everett
Hritage
Introduction
- Pour raccourcir les temps dcriture et de mise au point du
Hritage
Solution
- La classe Vehicule contient tout ce qu'il y a
Voiture
Camion
3
Hritage
Objectif de lhritage
- Ne dcrire qu'une seule fois le mme traitement lorsqu'il
Hritage
Usage de lhritage
- Une classe spcifique hrite des mthodes et des
attributs de sa classe mre (sauf ceux qui sont
privs)
- On n'a pas besoin de les rcrire pour la classe
fille
- On peut cependant redfinir une mthode de la
classe mre dans la classe fille (de mme
signature)
- Le constructeur d'un objet doit toujours
commencer par appeler le constructeur de sa
classe mre
5
Hritage
Usage de lhritage (suite)
- Un objet de type Voiture peut utiliser toutes les
mthodes de la classe Vehicule
- Il doit disposer dune valeur pour tous les attributs
de la classe Vehicule
- A tout moment, une mthode qui utilise un objet
de type Vehicule peut manipuler un objet de type
Voiture en guise de Vehicule
- Cette dernire proprit est le polymorphisme
6
Hritage
Exemple 1
class Vehicule {
// Vehicule() {}
}
class Voiture extends Vehicule {
int nbPortes;
double longueur;
Exemple 1 (suite)
class Garagiste {
public boolean garer(Vehicule v)
{
v.demarrer();
for (int pl=0;pl<nbPlaces;++pl)
{
if (place[pl].estLibre())
{
v.amener(place[pl]);
v.arreter();
return true;
}
}
System.out.println("Aucune place libre");
return false;
}
}
Un autre exemple
class Vehicule {
String couleur ;
int nbRoues ;
boolean seDeplace ;
}
class VehiculeAMoteur extends Vehicule {
int puissance ;
}
class Autoroute {
public static void main (String arg[]) {
Vehicule v = new Vehicule () ;
v.couleur = "rouge" ;
v.nbRoues = 2 ;
Hritage
Vocabulaire
- La classe A s'appelle une classe mre,
10
Exemple de modification
public class Rectangle {
private int x, y; // point 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);
}
}
// Mthodes modifies
public void dessineToi(Graphics g) {
g.setCouleur(couleur);
g.fillRect(getX(), getY(),
getLargeur(), getHauteur());
}
Hritage
seulement
crire le code (variables ou mthodes) li aux nouvelles
possibilits
14
Hritage
Redfinition et surcharge
- Ne pas confondre redfinition et surcharge des mthodes :
Rappel
- Signature dune mthode (nom de la mthode + ensemble
15
Lhritage en Java
Fonctionnement
- En Java, chaque classe a une et une seule classe
mre (pas dhritage multiple) dont elle hrite les
variables et les mthodes
- Le mot clef extends indique la classe mre :
class RectangleColore extends Rectangle
-
17
Hritage
Ce que peut faire une classe fille ?
- La classe qui hrite peut
ajouter des variables, des mthodes et des
constructeurs
redfinir des mthodes (exactement les mmes
types de paramtres)
surcharger des mthodes (mme nom mais pas
mme signature) (possible aussi lintrieur
dune classe)
18
Hritage
1re instruction dun constructeur
- La premire instruction (interdit de placer
19
Hritage
1re instruction dun constructeur
- super() permet d'appeler le constructeur de la
classe mre
- C'est la premire chose faire dans la
construction d'une sous-classe
- Appeler le constructeur de la classe mre garantit
que lon peut initialiser les arguments de la classe
mre
- On passe les paramtres ncessaires
- Si lon nindique pas super(), il y a un appel du
constructeur par dfaut de la classe mre
20
Hritage
21
Hritage
class Main {
public static void main(String args[]){
Voiture v = new Voiture();
v.demarrer();
}
}
-
class Main {
public static void main(String args[]){
Voiture v = new Voiture();
v.demarrer();
}
}
-
class Main {
public static void main(String args[]){
Voiture v = new Voiture();
v.super.demarrer();
}
}
-
Constructeur
Appel implicite du constructeur
de la classe mre
26
Constructeur
Mais la premire instruction dun constructeur
de la classe mre est lappel un constructeur
de la classe grand-mre , et ainsi de suite...
-
Hritage
Exemple dappel implicite du constructeur de la classe mre
class Vehicule {
// Vehicule() {}
}
29
Hritage
Exemple sur les constructeurs
public class Cercle {
// Constante
public static final double PI = 3.14;
// Variables
private Point centre;
Ici pas de constructeur sans
private int rayon;
paramtre
// Constructeur
public Cercle(Point c, int r) {
centre = c;
Appel implicite du
rayon = r;
constructeur Object()
}
30
Hritage
// Mthodes
public double surface() {
return PI * rayon * rayon;
}
public Point getCentre() {
return centre;
}
Hritage
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 enlve
cette instruction ?
couleur = c;
}
Exercice
nonc
- crire une classe Animal qui dispose dun attribut entier
nbPattes
- Cette classe dispose des mthodes suivantes :
35
38
Hritage
39
Hritage
Hritage et visibilit
- Une classe fille hrite des attributs et mthodes
public et protected de la classe mre
- Elle nhrite pas des attributs et mthodes private
- La classe mre ne voit que ce qui est public dans
la classe fille
- Un objet dune classe mre nhrite pas des
attributs et mthodes de ses classes filles
40
Hritage
Hritage
}
- On peut utiliser lattribut longueur dans Vehicule et dans
Voiture
- On ne peut pas utiliser lattribut nbPortes dans la classe
Vehicule
42
Hritage
Polymorphisme
- Cest un concept puissant de la POO qui complte
lhritage
- Il explique comment une mthode peut se
comporter diffremment suivant lobjet sur lequel
elle sapplique
- Plus prcisment, quand une mme mthode est
dfinie la fois dans la classe mre et dans la
classe fille, son excution est ralise en fonction
de lobjet associ lappel et non plus suivant le
nombre de paramtres, comme cest le cas lors de
la surcharge de mthodes
43
autre.x = tmp;
}// Fin de la classe Cercle
tmp = y;
tudions lexemple :
y = autre.y;
autre.y = tmp;
}
public void dplacer(int nx, int ny) {
x = nx;
y = ny;
}
} // Fin de la classe Forme
Polymorphisme
Explications
- La mthode afficher() est dcrite dans la classe
Forme et dans la classe Cercle
- Cette double dfinition ne correspond pas une
vritable surcharge de fonction
- En effet, les deux mthodes afficher() sont
dfinies sans aucun paramtre
- Le choix de la mthode ne peut donc seffectuer
sur la diffrence de paramtres
- Il est effectue par rapport lobjet sur lequel la
mthode est applique
45
Polymorphisme
Observons lexcution du programme suivant
public class FormerDesCercles {
public static void main(String [] arg) {
Cercle A = new Cercle1(5, 5);
A.afficher(); // applique A
Forme F = new Forme (10, 10);
F.afficher(); //applique F
}
}
46
Polymorphisme
Exemple : la situation
- Considrons cette situation dans laquelle les classes Point et
47
Polymorphisme
Exemple : rfrence
- Avec ces instructions
Point p;
p = new Point(3,5);
- On aboutit tout naturellement cette
situation
(Point)p
y
48
Polymorphisme
Exemple : changement de rfrence
- Mais il se trouve que Java autorise ce
(Point)p
couleur
49
Polymorphisme
Exemple : constat
- Java permet daffecter une variable objet
non seulement la rfrence un objet du
type correspondant, mais aussi une
rfrence un objet dun type driv
- On est en prsence dune conversion
implicite dune rfrence un type de
classe T en une rfrence un type
ascendant de T
50
Polymorphisme
Polymorphisme
Ligature dynamique
- Ce choix dune mthode au moment de
lexcution porte le nom de ligature
dynamique
En rsum
- Le polymorphisme en Java se traduit par :
Exemple :
54
Polymorphisme
Polymorphisme
Class Veto {
Public void soigner(Animal a) {
a.emettreSon();
Class ProprietaireDAnimaux {
Public void start() {
Veto v = new Veto();
Chien c = new Chien();
Hippo h = new Hippo();
v.soigner(c);
v.soigner(h);
}
56
Polymorphisme
Exemple 2
public class Figure {
public void dessineToi() { }
}
public class Rectangle extends Figure {
public void dessineToi() {
...
}
public class Cercle extends Figure {
public void dessineToi() {
...
}
57
Polymorphisme
public class Dessin { // dessin compos de plusieurs figures
private Figure[] figures;
...
public void afficheToi() {
for (int i=0; i < nbFigures; i++)
figures[i].dessineToi();
}
public static void main(String[] args) {
Dessin dessin = new Dessin(30);
. . . // cration des points centre, p1, p2
dessin.ajoute(new Cercle(centre, rayon));
dessin.ajoute(new Rectangle(p1, p2));
dessin.afficheToi();
58
Polymorphisme
Utilisation du polymorphisme
-
59
Polymorphisme
Utilisation du polymorphisme
- Le polymorphisme facilite lextension des programmes :
60
Polymorphisme
Extensibilit
- Avec la programmation objet, une
Polymorphisme
62
Polymorphisme
Syntaxe
- Pour caster un objet en classe C :
(C) o;
- Exemple :
Velo v = new Velo();
Vehicule v2 = (Vehicule) v;
63
Polymorphisme
UpCast : classe fille classe mre
- Upcast : un objet est considr comme une
instance dune des classes anctres de sa
classe relle
- Il est toujours possible de faire un upcast :
cause de la relation est-un de lhritage,
tout objet peut tre considr comme une
instance dune classe anctre
- Le upcast est souvent implicite
64
Polymorphisme
Utilisation du
UpCast
du polymorphisme :
65
Polymorphisme
DownCast : classe mre classe fille
- Downcast : un objet est considr comme
tant dune classe fille de sa classe de
dclaration
- Toujours accept par le compilateur, mais
peut provoquer une erreur lexcution ;
lexcution il sera vrifi que lobjet est
bien de la classe fille
- Un downcast doit toujours tre explicite
66
Polymorphisme
Utilisation du
DownCast
67
Polymorphisme
Polymorphisme
Classe final (et autres au final)
- Classe final :
Mthode final :
Cours5-TD5
Exercices 1-2
70