Modèle objet : les classes Voici quelques éléments : Véhicule, voiture, moto, 4*4, monospace Personne, étudiant, salarié, commerçant Animal, lion, chien, chat, tigre, poisson rouge Décrivez les classes correspondantes
Héritage par la généralisation La généralisation c'est : Factoriser les éléments communs d'un ensemble de classe : Attributs Méthodes Parmi les éléments précédents, faites apparaître l'héritage par généralisation
La généralisation exemple Comparons les comptes chèques et les comptes d'épargne : calculerInterets () crediterInterets () changerTaux () deposer () retirer () taux interets solde CompteEpargne changerDecouvert () decouvertAutorise CompteCheque Appliquez le principe de généralisation
Modèle objet : l'héritage Création d'une classe regroupant les caractéristiques communes Tous les attributs de la classe parent (super classe) sont des caractéristiques d'un objet créé à partir de la classe enfant calculerInterets () crediterInterets () changerTaux () taux interets CompteEpargne changerDecouvert () montantDecouvertAutorise CompteCheque deposer () retirer() solde CompteBancaire L'héritage se représente avec un trait terminé par un triangle du côté de la classe la plus générale
Modèle objet : la spécialisation Voici un autre ensemble d'éléments : Side car, bicyclette, voiture de sport Travailleur indépendant, écolier, collégien, retraité Loup, herbivore, diplodocus, licorne Compléter l'organisation des classes précédentes avec celles-ci
Modèle objet : la spécialisation Une classe spécialisée hérite de : Toutes les caractéristiques de la classe parent A le même comportement que la classe parent A ses comportements propres Grâce à ses caractéristiques personnelles Attributs méthodes
généralisation / spécialisation Héritage : généralisation / spécialisation La généralisation exprime la relation : est-un entre une classe et sa super classe La spécialisation définit un comportement supplémentaire Animal AnimalSauvage - lieuDeVie - modeAlimentation Super classe
Modèle objet : l'héritage L'héritage c'est : Le mécanisme permettant de dériver une classe à partir d'une classe existante L'héritage permet de classer Étendre structurellement et comportementalement une classe Permet de construire Réutiliser le code d'une classe existante
Modèle objet : l'héritage Classe dérivée (ou classe enfant) Hérite de toutes les caractéristiques de son (ses) ancêtre(s) Peut avoir des caractéristiques propres Peut redéfinir des caractéristiques héritées
java : l'héritage Héritage simple : Une classe ne peut hériter que d'une autre classe Toutes les classes en java forment un arbre d'héritage Dont le sommet est la classe Object Une classe déclarée sans relation d'héritage hérite quand même de la classe Object
l'héritage et les accès parents public class A { public void hello() { System.out.println("Hello"); } public class B extends A { public void bye() System.out.println("Bye Bye"); public class C extends B { public void oups() System.out.println("oups!"); Donnez le diagramme de classe A partir d'une instance de la classe C, comment afficher les messages des trois classes ?
java : l'héritage Complétez les classes Définir une classe dérivée extends par défaut : extends Object class CompteBancaire { } class CompteEpargne extends CompteBancaire { class TestCompteEpargne { public static void main( String [] arg ) { //... CompteEpargne ce; double interet; ce = new CompteEpargne(); ce.deposer( 100.0 ); interet = ce.calculerInterets(); } CompteBancaire.java TestCompteEpargne.java CompteEpargne.java Complétez les classes
java : l'héritage Appel du constructeur de la classe parent: En l’absence de constructeur, appel le constructeur par défaut de la classe mère Le compilateur insère un appel à la méthode super() Conseil: Pour éviter tout problème, toujours définir un constructeur !! Pour invoquer un constructeur de la classe mère : mot clé super() super(...) : doit être la première instruction class CompteBancaire { private double solde; CompteBancaire ( double soldeInitial ) { solde = soldeInitial; } // .. class CompteEpargne extends CompteBancaire { private double taux; CompteEpargne (double soldeInit, double tauxInit) { super ( soldeInit ); taux = tauxInitial; //...
l'arbre d'héritage Ordre d'appel des constructeurs L'appel à un constructeur de la super classe doit toujours être la première instruction dans le corps du constructeur Si la première instruction d'un constructeur n'est pas un appel explicite à l’un des constructeurs de la superclasse, alors JAVA insère implicitement l'appel super()
l'arbre d'héritage (suite) Chaque fois qu'un objet est créé, les constructeurs sont invoqués en remontant en séquence de classe en classe dans la hiérarchie jusqu'à la classe Object C'est le corps du constructeur de la classe Object qui est toujours exécuté en premier, suivi du corps des constructeurs des différentes classes en redescendant dans la hiérarchie.
l'arbre d'héritage (exemple)
l'héritage et les constructeurs Si une classe ne définit pas de constructeur, elle en possède un par défaut Sans paramètres Contenant uniquement l'instruction super() public class A extends Object { String nom; // méthodes String getNom() return nom; } ... public class Object { public Object() ... } public A() { super(); }
Quelques règles de visibilité Rappel : Les valeurs des attributs privés ne sont modifiables QUE dans la classe elle-même. Or, une classe dérivée DOIT avoir accès à tous les attributs de la classe mère. Les attributs de la classe mère ne doivent donc pas être privés, mais protégés.
Quelques règles de visibilité Pour déclarer un attribut protégé, on utilise le mot clef : protected Le symbole pour la représentation graphique est le #
Quelques règles de visibilité ClasseMère ClasseDérivée public défaut protected private Accessible dans la ClasseMère Accessible dans la ClasseDérivée oui non Les qualificatifs s'appliquent aux attributs et aux méthodes
Rappel de la symbolique Symbole Signification + public - private # protected La classe Lion hérite de la classe Animal. Lion est un Animal
Complétez les classes avec les constructeurs manquants. Une méthode afficher() pour chaque classe. Complétez le diagramme de classe. Une classe de test.