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