12/04/2017 8 Le polymorphisme Cours 8 Cours 8.

Slides:



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

Spécialisation/généralisation Héritage Polymorphisme.
Spécialisation/généralisation Héritage Polymorphisme
1 Quelques précisions sur l'héritage. 2 Signification de super.f() appel à la méthode f() masquée super : désigne l'objet appelant comme s'il était de.
SI3 MAM3 Hydro Nathan Cohen Igor Litovsky Christophe Papazian
Introduction à la programmation objet Langage Java
Langages objet Définitions Traduction des méthodes en C++
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Programmation Orientée Objet (POO)
Affichage des affectations des objets d’autorisation par transaction
Paramètres et pointeurs
Leçon 3 : Héritage IUP 2 Génie Informatique
Chapitre III Héritage (début)
Principes de programmation (suite)
Programmation orientée objet
Javascript les spécificités du langage - Partie 2-
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.
Langage Oriente Objet Cours 4.
POO-L3 H. Fauconnier1 Tableau et héritage Y[] yA=new Y[3]; X[] xA=yA; //ok xA[0]=new Y(); xA[1]=new X(); //non xA[1]=new Z(); //non Object XX[]int[] YZY[]Z[]
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
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,
Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
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 à la programmation objet Langage Java
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Introduction au paradigme orienté-objet (suite)
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Points importants de la semaine Le préprocesseur. La conversion de types. Les fonctions.
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
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).
C++ : fonctions et opérateurs
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
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.
INF1101 Algorithmes et structures de données
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
Héritage et composition
(Vient du grec et signifie « Peut prendre plusieurs formes »)
Travaux Pratiques Représentation des connaissances
4 Introduction des objets. Les chaînes et tableaux
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
La notion de type revisitée en POO
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
11/04/ L'héritage Cours 7 Cours 7.
Programmation objet La base.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Tutorat en bio-informatique
Introduction à la programmation objet en C++
5ième Classe (Mercredi, 19 octobre) Prog CSI2572.
PHP 7° PARTIE : PROGRAMMATION OBJET
Réaliser par: Sadok Amel Cheboui hassiba
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.
Le polymorphisme.
Cours du 5 novembre.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
LES CLASSES ET LES OBJETS
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.
Transcription de la présentation:

12/04/2017 8 Le polymorphisme Cours 8 Cours 8

Plan du cours 8 Polymorphisme Le problème 12/04/2017 Plan du cours 8 Polymorphisme Le problème Règle : affectation de références Rappel de la transmission de para  Résolution d'un appel de méthode Cas de la redéfinition Cas de la surcharge Cours 8 Cours 8

Polymorphisme Étymologiquement : plusieurs formes. 12/04/2017 Polymorphisme Étymologiquement : plusieurs formes. En pratique : le polymorphisme donne la possibilité d’appliquer à des listes d’objets apparentés une action portant le même nom, par exemple afficher(). L’action déclenchée est cependant spécifique à chacun de ces objets. La méthode d’affichage est propre à l’objet. Le mécanisme trouve dynamiquement la bonne méthode pour l’objet concerné. Cours 8 Cours 8

12/04/2017 Le problème Soit p un handle sur un objet de type Point défini comme suit : Point p = new Point(“P", 10, 20) Quelles méthodes sont accessibles avec le handle p? Point String nom CHAMPS int x int y METHODES Point(String nom, int x, int y) void déplacer(int nouveauX, int nouveau y) void déplacer(Point nouveau) SURCHARGE void afficher() On reprend l’exemple sans la privatisation pour simplifier les diapos. Pas de problème, ce sont les méthodes déplacer et afficher de sa classe. Cours 8 Cours 8

PointColoré hérite de Point 12/04/2017 Soit maintenant une classe PointColoré qui hérite de Point. Et un PointColoré pc = new PointColoré("PC",100, 200, Color.yellow)) Quelles méthodes puis-je utiliser avec pc ? PointColoré hérite de Point Color couleur CHAMP METHODES PointColoré(String nom, int x, int y, Color couleur) void afficher() REDEFINITION La méthode afficher() de PointColoré comme ceci : pc.afficher(). Mais aussi toutes les méthodes non privées de Point dont hérite PointColoré. Par exemple : pc.déplacer(300, 400). Cours 8 Cours 8

PointColoré hérite de Point 12/04/2017 Point String nom CHAMPS int x int y METHODES Point(String nom, int x, int y) void déplacer(int nouveauX, int nouveau y) void déplacer(Point nouveau) SURCHARGE void afficher() PointColoré hérite de Point Color couleur CHAMP METHODES PointColoré(String nom, int x, int y, Color couleur) void afficher() REDEFINITION Point p = new Point(“P", 10, 20); PointColoré pc; pc=new PointColoré("PC",100,200,Color.yellow)); pc.déplacer(1000, 2000); Point poly; poly.déplacer(300, 400); Et un PointColoré pc=new PointColoré("PC",100,200,Color.yellow)) Quelles méthodes puis-je utiliser avec pc ? La méthode afficher de PointColoré comme ceci : pc.afficher(). Mais aussi toutes les méthodes public ou protected de Point dont hérite PointColoré. Par exemple : pc.déplacer(300, 400) Définissons maintenant un handle poly de type Point : Point poly. Si l’on fait l’affectation : poly = p ; puis poly.déplacer(1000, 2000). poly apparaît comme un autre nom pour désigne l’objet créé avec p. C’est un alias. C’est l’objet de nom p qui est déplacé. Si l’on fait poly.afficher(), c’est la méthode afficher de Point qui est utilisée. A t’on le droit de faire l’affecation  : poly = pc ? autrement dit : référenceAncêtre = référenceDescendant OUI. Alors, si l’on fait poly.afficher(), quelle sera la méthode afficher() utilisée. Celle de Point ou celle de PointColoré ? Ce sera la méthode afficher()de PointColoré. C’est-à-dire la méthode de l’objet effectivement désigné par pc. poly = p; poly.déplacer(1000, 2000); alias poly.afficher(); poly = pc; ?????? poly.afficher(); Quelle méthode ??????? Cours 8 Cours 8

référenceAncêtre = référenceDescendant 12/04/2017 A t’on le droit de faire l’affectation  : poly = pc ? autrement dit : référenceAncêtre = référenceDescendant OUI. Alors, si l’on fait poly.afficher(), quelle sera la méthode afficher() utilisée : Celle de Point ou celle de PointColoré ? Ce sera la méthode afficher() de PointColoré. C’est-à-dire la méthode de l’objet effectivement désigné par pc. Cours 8 Cours 8

12/04/2017 Le polymorphisme permet alors à un handle de faire référence, au moment de l'exécution, à des instances de différentes classes issues d'une même lignée. C'est cette caractéristique qui donne toute sa puissance à la redéfinition. Ainsi, la liaison entre le handle et la méthode est réalisée au moment de l'exécution et non pas comme dans les langages habituels au moment de la compilation. On parle de liaison dynamique ou liaison retardée (late binding). Dans la pratique, cela se traduit par la possibilité d'appeler plusieurs méthodes du même nom. Ex : la surcharge ou la redéfinition. Cours 8 Cours 8

Règle : affectation de références 12/04/2017 Règle : affectation de références référenceAncêtre = référenceDescendant L'inverse est interdit. Mais un cast est possible. Dans ce cas il y aura contrôle de lignée à l'exécution. Du polymorphisme se déduit la possibilité d'affecter une référence sur un descendant à une référence d'un type ancêtre. Ce qui peut être compris comme : chaque objet d'une sous-classe est aussi un objet de la super classe mais avec des propriétés spéciales. Est donc admis par le compilateur : référenceAncêtre = référenceDescendant Cours 8 Cours 8

Rappel de la transmission de para : copie de valeurs 12/04/2017 Rappel de la transmission de para : copie de valeurs Règle de compatibilité au sens de l’affectation. Cours 8 Cours 8

Résolution d'un appel de méthode 12/04/2017 Résolution d'un appel de méthode Quelle sera la méthode appelée ? Cas de la redéfinition late binding Cas de la surcharge Cours 8 Cours 8

12/04/2017 Cas de la redéfinition Dans l'appel maRéférence.méthode(…), la résolution se fait en deux temps. Lors de la compilation, le compilateur examine le type du handle maRéférence et examine si, dans cette classe, il peut trouver une méthode (présente ou héritée) ayant une signature compatible (compatibilité au sens de l’affectation entre paramètres effectifs et formels). La liaison n’est pas encore figée. A l'exécution, s'il y a redéfinition, le choix de la méthode appelée dépend du type de l'objet effectivement pointé par maRéférence. La méthode appelée ne dépend pas de la classe du handle maRéférence mais est recherchée dans la classe de l'objet effectivement pointé par maRéférence. Dans une classe dérivée, une méthode a même nom et même signature qu’une méthode d’une classe ancêtre Dans l'appel maRéférence.méthode(…), la résolution se fait en deux temps. Lors de la compilation, le compilateur examine le type du handle maRéférence et examine si, dans cette classe, il peut trouver une méthode (présente ou héritée) ayant une signature compatible (compatibilité au sens de l’affectation entre paramètres effectifs et formels). La liaison n’est pas encore figée. A l'exécution, s'il y a redéfinition, le choix de la méthode appelée dépend du type de l'objet effectivement pointé par maRéférence. La méthode appelée ne dépend pas de la classe du handle maRéférence mais est recherchée dans la classe de l'objet effectivement pointé par maRéférence. Point p = new Point("P", 100, 200) ; p.afficher() ; // Méthode de Point appelée PointColoré pc = new PointColoré("PC", 10, 20); pc.afficher(); // Méthode de PointColoré appelée // Application du polymorphisme p = pc; // Ref ancêtre = ref descendant p.afficher(); // Méthode de PointColoré appelée *** p.déplacer(pc); // Méthode de Point, on lui transmet un point coloré *** L'objet effectivement pointé par p est de type PointColoré. Autrement dit, le choix de la méthode appelée se fait au moment de l'exécution : late binding. Cours 8 Cours 8

Cas de la redéfinition : exemple 12/04/2017 Cas de la redéfinition : exemple Point p = new Point("P", 100, 200) ; p.afficher() ; // Méthode de Point appelée PointColoré pc = new PointColoré("PC", 10, 20); pc.afficher(); // Méthode de PointColoré appelée // Application du polymorphisme p = pc; // Ref ancêtre = ref descendant p.afficher(); // Méthode de PointColoré appelée *** p.déplacer(pc); // Méthode de Point, on lui transmet un point coloré *** L'objet effectivement pointé par p est de type PointColoré. Autrement dit, le choix de la méthode appelée se fait au moment de l'exécution : late binding. Cours 8 Cours 8

12/04/2017 Cas de la surcharge Compatibilité des paramètres effectifs et formels (au sens de l’affectation). Les paramètres sont transmis par valeur (copie de la valeur). Cela vaut aussi pour les handles. Il y a donc compatibilité de paramètres lorsque une référence sur un descendant est transmise à un paramètre formel référence sur un ancêtre. Dans une même classe ou dans une classe dérivée, deux méthodes ont même nom et des signatures différentes. Compatibilité des paramètres effectifs et formels au sens de l’affectation. Les paramètres sont transmis par valeur (copie de la valeur). Cela vaut aussi pour les handles. Il y a donc compatibilité de paramètres lorsque une référence sur un descendant est transmise à un paramètre formel référence sur un ancêtre. Lorsque plusieurs méthodes possèdent des paramètres compatibles avec ceux de l'appel, Java choisit la méthode la plus spécifique, c'est-à-dire la plus basse dans la lignée hiérarchique. On peut rencontrer des méthodes compatibles de même niveau hiérarchique. L'appel est alors ambigu. L'appel ne pouvant être résolu par le compilateur, il est déclaré invalide. Ces cas ne seront pas étudiés ici. Cf. Le langage Java Ken Arnold et James Gosling, Thomson Publishing p114. Cours 8 Cours 8