Telechargé par Asmaa Bengueddach

Heritage poo avec P1

publicité
COURS 3
L’HÉRITAGE EN POO
Dr. Asmaa BENGUEDDACH
Teach with Your Heart ..
Dr Asmaa Bengueddach
Votre Mission …
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
3
Dr Asmaa BENGUEDDACH
4
Dr Asmaa BENGUEDDACH
5
Guerrier …
class Guerrier {
// Attributs
String nom;
int energie;
int dureeVie;
Arme arme;
// Méthodes
rencontrer (Personnage)
transformation()
seBattre(Personnage)
AttaqueFourdoyante(Personnage)
…
}
Dr Asmaa BENGUEDDACH
6
Magicien …
class Magicien{
// Attributs
String nom;
int energie;
int dureeVie;
Baguette baguette;
// Méthodes
rencontrer(Personnage);
Transformation() ;
jeterUnSort(Personnage);
Invisibilité();
…
}
Dr Asmaa BENGUEDDACH
7
Sorcier …
class Sorcier {
// Attributs
String nom;
int energie;
int dureeVie;
Baguette baguette;
LivreMagique Grimoire;
// Méthodes
rencontrer(Personnage);
Transformation() ;
jeterUnSort(Personnage);
Invisibilité();
voler()…
invoquerLesMorts()
}
Dr Asmaa BENGUEDDACH
8
Monstre …
class Monstre {
// Attributs
String nom;
int energie;
int dureeVie;
Griffe griffe;
// Méthodes
rencontrer(Personnage)
transformation()
attaqueSanguinaire(Personnage)
attaqueNocturne(Personnage)
…
}
Dr Asmaa BENGUEDDACH
9
Personnage …
class Personnage {
// Attributs
String nom;
int energie;
int dureeVie;
// Méthodes
rencontrer (Personnage)
transformation()
…
}
Dr Asmaa BENGUEDDACH
10
Héritage
class Personnage {
String nom;
int energie;
int dureeVie;
rencontrer (Personnage)
transformation() }
«est-un»
class Guerrier {
Arme arme;
seBattre(Personnage)
AttaqueFourdoyante(Personnage)
}
«est-un»
class Magicien{
Baguette baguette;
Batton batton;
jeterUnSort(Personnage);
Invisibilité(); }
«est-un»
class Monstre {
Griffe griffe;
attaqueSanguinaire(Personn
age)
attaqueNocturne(Personna
ge)}
«est-un»
class Sorcier {
Livre livreMagique;
Voler()
invoquerLesMorts()}
Dr Asmaa BENGUEDDACH
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
Classe
Héritage
spécialisation
Sous-Classe
Sous-Classe
Dr Asmaa BENGUEDDACH
Sous-Classe
12
Caractéristiques de l’Héritage
 Un C1 est (aussi) de type C.
 C1 hérite de C :
C
– Les attributs et méthode.
– Mais pas ses constructeurs.
C1
 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
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.
Dr Asmaa
Dr Asmaa
BENGUEDDACH
BENGUEDDACH
1414
Passons à la pratique …
class nomSousClasse extends nomSuperClasse {
/*déclaration des attributs et des méthode de la
sous classe*/
…
}
Exemple:
class Guerrier extends Personnage{
Arme arme;
…
}
Dr Asmaa BENGUEDDACH
15
Passons à la pratique …
class nomSousClasse extends nomSuperClasse {
/*déclaration des attributs et des méthode de la
sous classe*/
…
}
Exemple:
class Guerrier extends Personnage{
Arme arme;
…
}
Dr Asmaa BENGUEDDACH
16
Exemple d’1 attribut hérité
class Personnage{
//…
private int energie;
}
class Guerrier extends Personnage{
//…
public void seBattre(Personnage lePauvre)
if(energie> 0)//est ce une Err?
//frapper le perso
}
}
Dr Asmaa BENGUEDDACH
17
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
18
Exemple d’1 attribut hérité
class Personnage{
//…
protected int energie;
}
class Guerrier extends
Personnage{
//…
public void seBattre(Personnage
lePauvre)
if(energie > 0) // Correct
//frapper le perso
}
}
Dr Asmaa BENGUEDDACH
19
Exemple d’1 méthode héritée
class Personnage {
String nom;
int energie;
int dureeVie;
rencontrer (Personnage)
transformation() }
«est-un»
class Guerrier {
Arme arme;
seBattre(Personnage)
AttaqueFourdoyante(
Personnage)
}
Class Jeu{
Guerrier g = new Guerrier(…);
Monstre m= new Monstre(…);
…
g.rencontrer(m);
…
}
Dr Asmaa BENGUEDDACH
20
Héritage
class Personnage {
String nom;
int energie;
int dureeVie;
rencontrer (Personnage)
transformation() }
«est-un»
class Guerrier {
Arme arme;
seBattre(Personnage)
AttaqueFourdoyante(Personnage)
}
«est-un»
class Magicien{
Baguette baguette;
Batton batton;
jeterUnSort(Personnage);
Invisibilité(); }
«est-un»
class Monstre {
Griffe griffe;
attaqueSanguinaire(Personn
age)
attaqueNocturne(Personna
ge)}
«est-un»
class Sorcier {
Livre livreMagique;
Voler()
invoquerLesMorts()}
Dr Asmaa BENGUEDDACH
21
Sauf les Constructeurs !!!?
Dr Asmaa BENGUEDDACH
22
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
23
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 sousclasse ici }
Dr Asmaa BENGUEDDACH
24
Exemple (1) de constructeur
class FigureGeometrique{
protected Position position;
Public FigureGeometrique(double x, double y){
position = new Position(x,y);
}
//…
}
Class Rectangle extends FormeGeometrique{
Private double largeur;
Private double hauteur;
Public Rectangle(double x, double y, double l, double largeur) {
Super(x, y);
Largeur = l;
Hauteur = h;
//…}}
Dr Asmaa BENGUEDDACH
25
Exemple (2) de constructeur
Parfois il n’est pas nécessaire d’avoir des
attributs supplémentaires …
class Carre extends Rectangle{
public Carre(double taille) {
super(taille, taille);
//…}
}
Dr Asmaa BENGUEDDACH
26
Ordre d’appel des constructeurs
class A
a1
a2
m1(…)
m2(…)
class B
b1
m3(…)
m4(…)
class A
c1
c2
m5(…)
C monC = new C(…);
A(…){
a1 = …
a2 = …
}
B(…){
super(…);
b1= …
}
C(…){
super(…);
c1= …
c2= …
}
Dr Asmaa BENGUEDDACH
27
Ordre d’appel des constructeurs
class A
a1
a2
m1(…)
m2(…)
class B
b1
m3(…)
m4(…)
class A
c1
c2
m5(…)
C monC = new C(…);
A(…){
a1 = …
a2 = …
}
B(…){
super(…);
b1= …
}
En Java la
Résolution
des liens
est
Dynamique
C(…){
super(…);
c1= …
c2= …
}
Dr Asmaa BENGUEDDACH
28
class Premiere {
Premiere() {
System.out.println("construct
eur de Premiere");
}}
class Seconde extends Premiere {
Seconde(boolean b) {
class Troisieme extends Premiere {
Troisieme(int i) {
class Quatrieme extends Troisieme {
Quatrieme(double d) {
super();
System.out.println("constructeur
de Troisieme"); }}
super();
System.out.println("constructeur de
Seconde");}
}
super(14);
System.out.println("constructeur de
Quatrieme");}}
new Premiere();
System.out.println("====================");
new Seconde(true);
System.out.println("====================");
new Troisieme(15);
System.out.println("====================");
new Quatrieme(12.3);
29
class Premiere {
Premiere() {
System.out.println("constructe
ur de Premiere");
}}
class Sixieme extends
Cinquieme {
Sixieme () {
System.out.println("constr
ucteur de Sixieme");
}}
class Cinquieme extends
Premiere {
Cinquieme() {
System.out.println("const
ructeur de Cinquieme");
}}
new Cinquieme();
System.out.println("====
============");
new Sixieme();
Dr Asmaa BENGUEDDACH
30
 Le programme suivant provoque une erreur à la
compilation : la classe Huitieme est incorrecte?
class Septieme extends Premiere{
Septieme(int i){
System.out.println("constructeur de Septieme");
}
}
class Huitieme extends Septieme{
Huitieme(){
System.out.println("constructeur de Huitieme");
}
}
Dr Asmaa BENGUEDDACH
31
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);}
32
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
33
Résumé (2)
 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
34
Polymorphisme
Qui ?
Dr Asmaa BENGUEDDACH
Je..
35
Exemple d’1 redéfinition
 Redéfinir la méthode rencontrer(Personnage p)
pour la classe Monstre.
class Monstre extends Personnage{
…
Rencontrer(Personnage p){
frapper(p);
}
}
Dr Asmaa BENGUEDDACH
36
Exemple: rencontrer(Personnage p)
Rencontrer(Personnage p){
frapper(p);
}
Rencontrer(Personnage p){
saluer(p);
}
Dr Asmaa BENGUEDDACH
37
Avez vous une question ?
N’oubliez pas votre prochaine mission …
Next …
Dr Asmaa BENGUEDDACH
38
Téléchargement