Nous avons vu dans le chapitre précédent « La pensée objets » et comment créer des classes et instancier des objets. Deux concepts clés ont été expliqués via le projet 2 : l’encapsulation et les constructeurs. Dans ce chapitre, nous allons nous intéresser à la relation entre les classes via les notions de composition et d’héritage
4. I. A quoi sert Héritage ?
II. Quand utiliser protected ou private ?
III. Comment définir les nouveaux constructeurs ?
IV. Comment redéfinir une méthode ?
Dr Asmaa BENGUEDDACH
4
Votre Mission …
5. Guerrier …
Dr Asmaa BENGUEDDACH 5
class Guerrier {
// Attributs
String nom;
int energie;
int dureeVie;
Arme arme;
// Méthodes
rencontrer (Personnage)
transformation()
seBattre(Personnage)
AttaqueFourdoyante(Personnage)
…
}
6. Magicien …
Dr Asmaa BENGUEDDACH 6
class Magicien{
// Attributs
String nom;
int energie;
int dureeVie;
Baguette baguette;
// Méthodes
rencontrer(Personnage);
Transformation() ;
jeterUnSort(Personnage);
Invisibilité();
…
}
7. Sorcier …
Dr Asmaa BENGUEDDACH 7
class Sorcier {
// Attributs
String nom;
int energie;
int dureeVie;
Baguette baguette;
LivreMagique Grimoire;
// Méthodes
rencontrer(Personnage);
Transformation() ;
jeterUnSort(Personnage);
Invisibilité();
voler()…
invoquerLesMorts()
}
8. Monstre …
Dr Asmaa BENGUEDDACH 8
class Monstre {
// Attributs
String nom;
int energie;
int dureeVie;
Griffe griffe;
// Méthodes
rencontrer(Personnage)
transformation()
attaqueSanguinaire(Personnage)
attaqueNocturne(Personnage)
…
}
9. Personnage …
Dr Asmaa BENGUEDDACH 9
class Personnage {
// Attributs
String nom;
int energie;
int dureeVie;
// Méthodes
rencontrer (Personnage)
transformation()
…
}
10. Héritage
Dr Asmaa BENGUEDDACH 10
class Personnage {
String nom;
int energie;
int dureeVie;
rencontrer (Personnage)
transformation() }
class Guerrier {
Arme arme;
seBattre(Personnage)
AttaqueFourdoyante(Personnage)
}
class Magicien{
Baguette baguette;
Batton batton;
jeterUnSort(Personnage);
Invisibilité(); }
class Monstre {
Griffe griffe;
attaqueSanguinaire(Person
nage)
attaqueNocturne(Personnag
e)}
class Sorcier {
Livre livreMagique;
Voler()
invoquerLesMorts()}
«est-un»«est-un»«est-un»
«est-un»
11. L’Héritage
✧ Représente la relation « est-un ».
✧ Permet de créer des classes plus spécialisées
« sous-classes » à partir de classes plus générales
déjà existantes, appelées « super-classes ».
✧ Évite la duplication du code
Dr Asmaa BENGUEDDACH 11
Classe
Sous-ClasseSous-Classe Sous-Classe
Héritage spécialisation
12. Caractéristiques de
l’Héritage
✧ Un C1 est (aussi) de type C.
✧ C1 hérite de C :
– Les attributs et méthode.
– Mais pas ses constructeurs.
✧ De plus :
– On peut définir des attributs et méthode supp =>
ENRICHISSEMENT
– On peut redéfinir certaines méthodes de C =>
SPÉCIALISATION
Dr Asmaa BENGUEDDACH 12
C
C1
13. Dr Asmaa BENGUEDDACH 13Dr Asmaa BENGUEDDACH 13Dr Asmaa BENGUEDDACH 13
Définition — Un rectangle est un quadrilatère qui possède
quatre angles droits.
Ensuite compléter sa définition en le reliant aux autres
objets du même domaine.
14. Passons à la pratique …
class nomSousClasse extends nomSuperClasse {
/*déclaration des attributs et des méthode de
la sous classe*/
… }
Dr Asmaa BENGUEDDACH 14
class Carre extends Rectangle{
…
}
15. Exemple d’1 attribut hérité
Dr Asmaa BENGUEDDACH 15
class Personnage{
//…
private int energie;
}
class Guerrier extends Personnage{
//…
public void seBattre(Personnage
lePauvre)
if(energie>0)&&(energie>
lePauvre.energie)
//frapper le perso
}
}
16. Droit d’accès "protected"
✧ C1 n’a pas le droit d’accès aux membres
(attributs ou méthodes) privés hérités de
C.
✧ Si C veut permettre à Ci d’accèder à un
membre donné, elle doit le déclarer
comme protégé (protected).
✧ Peu recommandé => nuit à une bonne
encapsulation en Java.
Dr Asmaa BENGUEDDACH 16
17. Exemple d’1 attribut hérité
Dr Asmaa BENGUEDDACH 17
class Personnage{
//…
protected int energie;
}
class Guerrier extends Personnage{
//…
public void seBattre(Personnage lePauvre)
if(energie>0)&&(energie>lePauvre.energie)
// Correct
//frapper le perso
}
}
18. Exemple d’1 méthode
héritée
Class Jeu{
Guerrier g=new Guerrier(…);
Monstre m= new Monstre(…);
…
g.rencontrer(m);
…
}
Dr Asmaa BENGUEDDACH 18
class Personnage {
String nom;
int energie;
int dureeVie;
rencontrer (Personnage)
transformation() }
class Guerrier {
Arme arme;
seBattre(Personnage
)
AttaqueFourdoyante(
Personnage)
}
«est-un»
20. Comment faire ?
✧ Le constructeur de C1, doit initialiser :
✧ Ses attributs propres.
✧ Les attributs hérités C.
✧ Mais !!!!
✧ Ce n’est pas aux constructeurs de C1 de
réaliser l’initialisation des attributs hérités
✧ Solution: invoquer les constructeurs de C
avec Super()
Dr Asmaa BENGUEDDACH 20
21. Passons à la pratique …
nomSousClasse (liste des paramètres){
/*Arguments : liste d’arguments attendus par un des
constructeurs de la super-classe */
super(Arguments)
// initialisation des attributs de la sous-classe ici
var1 = ….
var2 = .…
}
Dr Asmaa BENGUEDDACH 21
22. Exemple (1) de
constructeur
Dr Asmaa BENGUEDDACH 22
class Carre extends Rectangle{
public Carre(double taille) {
super(taille, taille);
//…
}
}
Parfois il n’est pas nécessaire d’avoir des
attributs supplémentaires …
23. Dr Asmaa BENGUEDDACH 23
Avez vous une question ?
N’oubliez pas votre prochaine
mission …
Next …
25. Exemple d’1 redéfinition
✧ Redéfinir la méthode rencontrer(Personnage p)
pour la classe Monstre.
Dr Asmaa BENGUEDDACH 25
class Monstre extends Personnage{
…
Rencontrer(Personnage p){
frapper(p);
}
}
26. Exemple (2) de
constructeur
Dr Asmaa BENGUEDDACH 26
class FigureGeometrique{
protected Position position;
public FigureGeometrique(Position position){
position = new Position(x,y);
}
//…
}
Class Rectangle extends FormeGeometrique{
protected double longueur;
protected double hauteur;
public Rectangle(Position p, double longueur, double hauteur)
{
super(x, y);
this.largeur = longueur;
this.hauteur = hauteur;
//…}
}
27. Ordre d’appel des constructeurs
Dr Asmaa BENGUEDDACH 27
class A
a1
a2
m1(…)
m2(…)
class B
b1
m3(…)
m4(…)
class A
c1
c2
m5(…)
A(…){
a1= …
a2= …
}
B(…){
super(…);
b1= …
}
C(…){
super(…);
c1= …
c2= …
}
C monC = new C(…);
28. Dr Asmaa BENGUEDDACH 28
Ordre d’appel des constructeurs
Dr Asmaa BENGUEDDACH 28
class A
a1
a2
m1(…)
m2(…)
class B
b1
m3(…)
m4(…)
class A
c1
c2
m5(…)
A(…){
a1= …
a2= …
}
B(…){
super(…);
b1= …
}
C(…){
super(…);
c1= …
c2= …
}
C monC = new C(…);
En Java la
Résolution
des liens
est
Dynamique
29. 29
class Premiere {
public Premiere() {
System.out.println("constructe
ur de Premiere");
}}
class Quatrieme extends Troisieme {
public Quatrieme(double d) {
super(14);
System.out.println("constructeur de
Quatrieme");}}
class Deuxieme extends
Premiere {
public Deuxieme(boolean b) {
super();
System.out.println("constructe
ur de Seconde");}
}
class Troisieme extends Premiere {
public Troisieme(int i) {
super();
System.out.println("constructeur de
Troisieme"); }}
new Premiere();
System.out.println("====================");
new Deuxieme(true);
System.out.println("====================");
new Troisieme(15);
System.out.println("====================");
new Quatrieme(12.3);
30. Dr Asmaa BENGUEDDACH 3030
new Cinquieme();
System.out.println("================");
new Sixieme();
Premiere
Cinquieme
Sixieme
public Premiere() {
System.out.println("cons
tructeur de Premiere");
}
public Cinquieme() {
System.out.println("con
structeur de
Cinquieme");
}
public Sixieme () {
System.out.println("cons
tructeur de Sixieme");
}}
31. Dr Asmaa BENGUEDDACH 3131
class Cinquieme extends
Premiere {
public Cinquieme() {
System.out.println("constructe
ur de Cinquieme");
}}
class Sixieme extends public
Cinquieme {
public Sixieme () {
System.out.println("constructe
ur de Sixieme");
}}
new Cinquieme();
System.out.println("==========
======");
new Sixieme();
class Premiere {
public Premiere() {
System.out.println("constructe
ur de Premiere");
}}
32. Dr Asmaa BENGUEDDACH 32
class Septieme extends Premiere{
public Septieme(int i){
System.out.println("constructeur de Septieme");
}
}
class Huitieme extends Septieme{
public Huitieme(){
System.out.println("constructeur de Huitieme");
}
}
✧ Le programme suivant provoque une erreur à la
compilation : la classe Huitieme est incorrecte?
33. 33
class Neuvieme extends Premiere{
public Neuvieme(int i){
System.out.println("premier constructeur de Neuvieme");}
public Neuvieme(boolean b){
System.out.println("second constructeur de Neuvieme");}}
class Dixieme extends Neuvieme{
public Dixieme(double d){
super(true);
System.out.println("premier constructeur de Dixieme");}
public Dixieme(int x, boolean y){
super(x);
System.out.println("second constructeur de Dixieme");
}}
34. 34
class Neuvieme extends Premiere{
Neuvieme(int i){
System.out.println("premier constructeur de Neuvieme");}
Neuvieme(boolean b){
System.out.println("second constructeur de Neuvieme");}}
class Dixieme extends Neuvieme{
Dixieme(double d){
super(true);
System.out.println("premier constructeur de Dixieme");}
Dixieme(int x, boolean y){
super(x);
System.out.println("second constructeur de Dixieme");
}}
…..
public static void main(String[] args){
new Dixieme(10.5);
System.out.println("=============================");
new Dixieme(45, true);}
35. Résumé (1)
✧ Chaque constructeur de C1 doit appeler
super(…).
✧ Les arguments fournis à super doivent être au
moins ceux corr à l’un des constructeurs de C.
✧ L’appel super() doit être la toute 1ère instruction.
✧ Erreur si l’appel vient plus tard ou 2 fois.
✧ Aucune une autre méthode ne peut appeler
super (…)
Dr Asmaa BENGUEDDACH 35
36. ✧ Et si on oublie l’appel à super(…) ?
✧Appel automatique à super().
✧Pratique parfois, mais erreur si le constructeur par défaut
n’existe pas.
✧Rappel: le constructeur par défaut est particulier.
✧Il est existe par défaut pour chaque classe qui n’a aucun
autre constructeur
✧Il disparaît dès qu’il y a un autre constructeur
✧ Pour éviter des problèmes avec la hiérarchie de
classes:
✧Toujours déclarer au moins un constructeur
✧Toujours faire l’appel à super(…)
Dr Asmaa BENGUEDDACH 36
Résumé (2)