Chapitre 7: Héritage Présentation pour Java Software Solutions Foundations of Program Design Second Edition by John Lewis and William Loftus Java Software.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Spécialisation/généralisation Héritage Polymorphisme.
Gestion des événements (suite)
Systèmes en temps réel Héritage avec les capsules.
(Classes prédéfinies – API Java)
Introduction à Java - les paquetages -
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
Leçon 3 : Héritage IUP 2 Génie Informatique
Introduction à la POO: Les classes vs les objets
Programmation par Objets et Java
Chapitre III Héritage (début)
Principes de programmation (suite)
Programmation orientée objet
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Concepts de base : la Classe Pour faire une comparaison simple, une classe serait a priori, une structure C avec des variables et des fonctions.
CSI1502 Principes fondamentaux en conception des logiciels Chapitre 7: Lhéritage.
Langage Oriente Objet Cours 4.
COURS DE PROGRAMMATION ORIENTEE OBJET :
IFT1025, Programmation 2 Jian-Yun Nie
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
POO : Objets et classes (Rappels)
Structures de données IFT-2000
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Introduction au paradigme orienté-objet (suite)
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Langages orientés objets
Chapitre III Héritage. POO-L3 H. Fauconnier2 Chapitre III: Héritage A) Extensions généralités Affectation et transtypage B) Méthodes Surcharge et signature.
Cours 4 Héritage (suite).
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Principes fondamentaux en conception des logiciels
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
Héritage et composition
Travaux Pratiques Représentation des connaissances
Objectifs À la fin de ce cours, vous serez capables de :
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
11/04/ L'héritage Cours 7 Cours 7.
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
12/04/ Le polymorphisme Cours 8 Cours 8.
Tutorat en bio-informatique
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
C++ L’HERITAGE Fayçal BRAÏKI DUT INFORMATIQUE.
Réaliser par: Sadok Amel Cheboui hassiba
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Les classes et les objets Les données finales class A { … private final int n = 20 ; // la valeur de n est définie dans sa déclaration … } class A { public.
Cours LCS N°4 Présenté par Mr: LALLALI
Le polymorphisme.
Cours du 5 novembre.
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Les classes Introduction aux Langages Orientés Objets
La programmation par objets Principes et concepts Etude de Smalltalk.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
Campus-Booster ID : Copyright © SUPINFO. All rights reserved La programmation objet, un fondement de la programmation évènementielle.
Classes abstraites, interface Classe interne Classes enveloppes
Introduction à la Programmation Orientée Objet
Chapitre 4: Classes Présentation pour Java Software Solutions Foundations of Program Design Deuxième Edition par John Lewis et William Loftus Java Software.
Chapitre 5: Améliorer les Classes Présentation pour Java Software Solutions Foundations of Program Design Deuxième Edition par John Lewis et William Loftus.
Retour sur les interfaces Les méthodes définies dans une interface sont des méthodes qui doivent absolument être implémentées par une ou des sous-classes.
Chapitre 6: Tableaux et Vecteurs Présentation pour Java Software Solutions Foundations of Program Design Second Edition by John Lewis et William Loftus.
JAVA et l'orientation objet Jean-Jacques LE COZ. Encapsulation L'encapsulation est le concept de masquer l'implémentation de la classe De ne permettre.
FACTORY systemes Module 6 Section 1 Page 6-3 Les ActiveX FORMATION INTOUCH 7.0.
Transcription de la présentation:

Chapitre 7: Héritage Présentation pour Java Software Solutions Foundations of Program Design Second Edition by John Lewis and William Loftus Java Software Solutions is published by Addison-Wesley Presentation slides are copyright 2000 by John Lewis and William Loftus. All rights reserved. Instructors using the textbook may use and modify these slides for pedagogical purposes.

2 Héritage  L’héritage est une autre technique orientée-objet qui améliore la conception de logiciels et permet une meilleur réutilisation  Le chapitre 7 se concentre sur : Dériver de nouvelles classesDériver de nouvelles classes Créer une hiérarchie de classesCréer une hiérarchie de classes Le modificateur protectedLe modificateur protected polymorphisme via l’héritagepolymorphisme via l’héritage L’utilisation de l’héritage dans les interfaces usagers graphiquesL’utilisation de l’héritage dans les interfaces usagers graphiques

3 Héritage  L’héritage permet au concepteur de logiciels de dériver une nouvelle classe à partir d’une classe existante  La classe existante est la classe parent, ou superclasse, ou encore la classe de base  La classe dérivée est appelée la classe enfant ou sous-classe.  Comme le nom l’implique, la classe enfant hérite des caractéristiques du parent  C’est à dire, la classe enfant hérite des méthodes et des données définies pour la classe parent

4 Héritage  Une relation d’héritage est souvent illustrée dans un diagramme de classes, à l’aide d’une flèche pointant vers la classe parent L’héritage crée une relation is-a, ce qui veut dire que l’enfant est une version plus spécialisée du parent Vehicle Car

5 Dérivation de Sous-classes  En Java, nous utilisons le mot réservé extends pour établir une relation d’héritage class Car extends Vehicle { // class contents // class contents}  Voir Words.java (page 324) Words.java  Voir Book.java (page 325) Book.java  Voir Dictionary.java (page 326) Dictionary.java

6 Contrôle de l’héritage  Les modificateurs de visibilité déterminent quels membres d’une classe sont hérités et lesquels ne le sont pas  Les variables et méthodes déclarées de visibilité public sont héritées, alors que celles contrairement à ceux dont la visibilité est private  Par contre, des variables public vont à l’encontre de notre but d’encapsuler les données  Il existe un troisième modificateur de visibilité qui est utile en situations d’héritage : protected

7 Le Modificateur protected  Le modificateur de visibilité protected permet à un membre d’une classe de base d’être hérité par la classe enfant  La visibilité protected offre plus d’encapsulation que public  Par contre, la visibilité protected est moins encapsulé que la visibilité private  Les détails de chaque modificateur sont donnés à l’Annexe F

8 La Référence super  Les constructeurs ne sont pas hérités, même s’ils ont une visibilité public  Par contre, il est souvent souhaitable de pouvoir utiliser le constructeur du parent pour initialiser la partie de l’objet héritée du parent  La référence super peut être utilisée pour faire référence à la classe parent. Celle-ci est souvent utilisée pour invoquer le constructeur du parent  Voir Words2.java (page 328) Words2.java  Voir Book2.java (page 329) Book2.java  Voir Dictionary2.java (page 330) Dictionary2.java

Héritage Simple vs. Multiple  Java supporte l’héritage simple, donc une classe dérivée n’a qu’une seule classe parent  L’héritage Multiple permet qu’une classe soit dérivée de deux classes ou plus, héritant des membres de tous ses parents  Les collisions, telles le même nom de variable dans deux parents, doivent être résolues  La plupart du temps, l’utilisation des interfaces nous permet les mêmes avantages que l’héritage multiple mais sans l’overhead

10 Redéfinition de Méthodes  Une classe enfant peut redéfinir une méthode héritée pour favoriser la sienne  C’est à dire, un enfant peut redéfinir une méthode qu’il hérite de son parent  La nouvelle méthode doit conserver la même signature que la méthode du parent, tout en ayant du code différent  Le type de l’objet qui exécute la méthode détermine quelle version de la méthode est invoquée

Redéfinition de Méthodes  Voir Messages.java (page 332) Messages.java  Voir Thought.java (page 333) Thought.java  Voir Advice.java (page 334) Advice.java  À noter, une méthode du parent peut être invoquée explicitement en utilisant la référence super  si une méthode est déclarée avec le modificateur final, elle ne peut être redéfinie  Le concept de redéfinition peut s’appliquer aux données (shadowing variables), mais généralement ce n’est pas utile

12 Surcharge vs. Surdéfinition  Ne vous mélangez entre les concepts de surcharge et de redéfinition  La surcharge traite de plusieurs méthodes d’une même classe ayant le même nom mais des signatures différentes  La redéfinition traite de deux méthodes, une dans la classe parent et une dans la classe enfant, avec la même signature  La surcharge permet de définir une opération similaire de façon différente pour des données différentes  La redéfinition permet de définir une opération similaire de façon différente pour des objets différents

13 Hiérarchie de Classes  Une classe qui est l’enfant d’un parent peut être le parent d’un autre enfant, formant ainsi une hiérarchie de classes Business RetailBusinessServiceBusiness KMartMacysKinkos

14 Hiérarchie de Classes  Deux enfants du même parent sont appelés frères  Une bonne conception de classes va placer toutes les particularités communes aussi haut que possible dans la hiérarchie  Un membre hérité sera continuellement passé vers le bas de la hiérarchie  La hiérarchie de classes doit souvent être étendue et modifiée pour s’adapter à des besoins changeant  Il n’existe pas de hiérarchie de classes unique qui soit appropriée pour toutes les situations

15 La Classe Object  Une classe nommée Object est définie dans le package java.lang de la librairie standard de classes de Java  Toutes les classes sont dérivées de la classe Object  Si une classe n’est pas définie explicitement comme étant l’enfant d’une classe existante, elle est présumée être un enfant de la classe Object  La classe Object est donc la racine de toutes hiérarchies de classes

La Classe Object  La classe Object contient quelques méthodes utiles, qui sont héritées par toutes les classes  Par exemple, la méthode toString est définie dans la classe Object  Chaque fois que nous avons définie toString, nous la redéfinissions  La méthode toString dans la classe Object est définie pour retourner une chaîne de caractères contenant le nom de la classe de l’objet, et une valeur en hexa

La Classe Object  C’est pourquoi la méthode println peut appelée toString pour tous les objets qui lui sont passés – tous les objets sont assurés d’avoir une méthode toString via l’héritage  Voir Academia.java (page 339) Academia.java  Voir Student.java (page 340) Student.java  Voir GradStudent.java (page 341) GradStudent.java  La méthode equals de la classe Object détermine si deux références sont des alias  Vous pouvez choisir de redéfinir equals pour vérifier l’égalité d’une autre façon

Classes Abstraites  Une classe abstraite représente un concept générique dans la hiérarchie de classes  Une classe abstraite ne peut être instanciée  Nous utilisons le modificateur abstract sur le prototype de la classe pour déclarer qu’elle est abstraite  Une classe abstraite contient souvent des méthodes abstraites (comme les interfaces), par contre ce n’est pas nécessaire

Classes Abstraites  L’enfant d’une classe abstraite doit redéfinir les méthodes abstraites de son parent, sinon elle sera aussi considérée abstraite  Une méthode abstraite ne peut pas être définie comme final (car elle doit être redéfinie) ou static (car elle ne possède pas encore de définition)  L’utilisation d’une classe abstraite est une décision de conception; elle aide à établir des éléments communs dans une classe trop générale pour être instanciée

20 Références et Héritage  Un référence sur objet peut référer à un objet de sa classe, ou à un objet de toute classe qui lui est lié par héritage  Par exemple, si la classe Holiday est utilisée pour dériver une classe enfant Christmas, alors une référence sur Holiday pourrait être utilisée pour pointer sur un objet Christmas Holiday Christmas Holiday day; day = new Christmas();

21 Références et Héritage  Affecter un objet prédécesseur à une référence ancêtre est considéré une conversion non-dégradante, et peut se faire avec une simple affectation  Affecter un objet ancêtre à une référence prédécesseur est aussi possible, par contre, c’est considéré une conversion dégradante et doit absolument être faite avec un cast  La conversion non-dégradante est la plus utile

22 Polymorphisme via Héritage  Dans le Chapitre 5, nous avons vu qu’une interface peut être utilisée pour créer une référence polymorphe  Souvenez-vous qu’une référence polymorphe peut faire référence à différents types d’objets à différent temps  L’héritage peut aussi servir de base au polymorphisme  Une référence sur un objet peut faire référence à un objet à un moment donné, elle peut ensuite changer pour faire référence à un autre objet (lié par l’héritage) à un autre moment

Polymorphisme via Héritage  Supposons que la classe Holiday a une méthode nommée celebrate, et que la classe Christmas la redéfinie  Considérons l’invocation suivante: day.celebrate();  Si day fait référence à un objet Holiday, il invoque la version Holiday de celebrate ; S’il fait référence à un objet Christmas, il invoque la version Christmas

24 Polymorphisme via Héritage  C,est le type de l’objet qui est référencé, et non le type de la référence, qui détermine quelle méthode sera invoquée  Notez que, si une invocation est dans une boucle, la même ligne de code pourrait exécuter des méthodes différentes à des temps différents  Les références polymorphes sont donc résolues à l’exécution, et non à la compilation

Polymorphisme via Héritage  Considérons la hierarchie de classes suivante : StaffMember VolunteerEmployee ExecutiveHourly

Polymorphisme via Héritage  Considérons maintenant la tâche de payer les employés  Voir Firm.java (page 345) Firm.java  Voir Staff.java (page 346) Staff.java  Voir StaffMember.java (page 348) StaffMember.java  Voir Volunteer.java (page 349) Volunteer.java  Voir Employee.java (page 351) Employee.java  Voir Executive.java (page 352) Executive.java  Voir Hourly.java (page 353) Hourly.java

27 Accès Indirect  Un membre hérité peut être référencé directement par son nom dans la classe enfant, comme s’il était déclaré dans celle-ci  Même si une méthode ou une variable n’est pas héritée par un enfant, elle peut être accédée indirectement à travers une méthode du parent  Voir FoodAnalysis.java (page 355) FoodAnalysis.java  Voir FoodItem.java (page 356) FoodItem.java  Voir Pizza.java (page 357) Pizza.java

Hiérarchies d’Interface  L’héritage peut s’appliquer aux interfaces autant qu’aux classes  Une interface peut être utilisée comme parent d’une autre  L’interface enfant hérite de toutes les méthodes abstraites du parent  Une classe qui implémente l’interface enfant doit définir toutes les méthodes des interfaces parent et enfant  Notez que la hiérarchie de classes et la hiérarchie des interfaces sont distinctes (elles ne se chevauchent pas)

Applets et Héritage  Une applet est une excellente exemple d’héritage  Rappelez-vous qu’en définissant une applet, nous dérivons (extend) la classe Applet  La classe Applet peut déjà gérer les détails de sa création et de son exécution, incluant l’interaction avec le fureteur web  Nos classes applet n’ont qu’à gérer les aspects qui touchent spécifiquement à notre applet particulière

Dériver les Classes Event Adapter  Au chapitre 5, nous avons discuté de la création de classes d’auditeurs (listener) en implémentant une interface particulière (ex. MouseListener )  Un auditeur peut aussi être créé en dérivant une classe adapter spéciale de la librairie de classes de Java  Chaque interface listener a une classe adapter correspondante (par ex. la classe MouseAdapter )  Chaque classe adapter implémente le listener correspondant et fournit des définitions de méthodes vides

Dériver les Classes Event Adapter  Lorsque vous dérivez une classe listener à partir d’une classe adapter, vous redéfinissez toutes les méthodes d’événements intéressante (comme la méthode mouseClicked )  Notez que ceci élimine le besoin de créer des définitions vide pour des événements non utilisés  Voir OffCenter.java (page 360) OffCenter.java

Composantes du GUI  Une composante du GUI est un objet représentant une entité visuelle dans une interface usager graphique (comme un bouton ou un slider)  Les composantes peuvent générer des événements auxquels les objets listener peuvent réagir  Par exemple, une applet est une composante qui peut générer des événements de souris  Une applet est aussi une sorte spéciale de composante, appelée un container, dans lequel d’autres composantes peuvent être placées

Composantes du GUI  Voir Fahrenheit.java (page 363)  Les composantes sont organisées en hiérarchie de classes héritées de manière à pouvoir partager des caractéristiques  Lorsque nous définissons certaines méthodes, comme la méthode paint d’une applet, nous redéfinissons une méthode définie dans la classe Component, qui est héritée par la classe Applet  Voir Doodle.java (page 367) Doodle.java  Voir DoodleCanvas.java (page 369) DoodleCanvas.java