Spécialisation covariante cours et TP. Plan  Introduction  Rappels théoriques  Définition de la covariance  Présentation du modèle servant d'exemple.

Slides:



Advertisements
Présentations similaires
Formation universitaire à .NET: Introduction à C#
Advertisements

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.
Introspection et Réflexion Manipulation dynamique de code Java.
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Chapitre III Héritage (début)
Pattern État PowerPoint 2003, télécharger la visionneuse PowerPoint Viewer dernière édition si vous ne lavez pas…télécharger la visionneuse PowerPoint.
Programmation orientée objet
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Langage Oriente Objet Cours 4.
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
Introduction à la Programmation Orientée Objet Retour sur les principaux concepts SI3 MAM3 Hydro Nathan Cohen
Introduction au paradigme orienté-objet (suite)
P. Van Roy, LINF1251 LINF1251: Le Langage Java Peter Van Roy Département dIngénierie Informatique, UCL
Design Pattern: Decorator
Formation JAVA. Par: SILMI.S
1 Les paquetages («packages»). 2 L'objectif avec les paquetages («packages») est de rendre accessibles aux utilisateurs des classes définies par d'autres.
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.
Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure dInformatique (ESI) Plate-forme.NET.
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é.
Une introduction à Java
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
11/04/ L'héritage Cours 7 Cours 7.
12/04/ Le polymorphisme Cours 8 Cours 8.
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
Les sockets.
Un visiteur… …venu d’ailleurs
Les surcharges d'opérateurs
CSI2520 Un langage de programmation impérative et concurrente.
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)
Iterator Design Pattern Alessandro Soro Sylvain Giroux.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Introduction à la programmation objet avec java
Héritage Conception par Objet et programmation Java
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Template Method Design Pattern. But Définir le squelette d’un algorithme tout en déléguant certaines étapes aux sous-classes. Les sous-classes peuvent.
Design Patterns.  SIDAOUI Abdelfahem  
Développement d’application avec base de données Semaine 3 : Modifications avec Entité Framework Automne 2015.
Les outils de tests 1 1 CHAKI Abderrazak - ETIENNE Jonathan - TOUMI Nacereddine - VACHER Nicolas.
Présentation de la série STMG  Spécialisation progressive  Classe de première unique  Choix d’orientation repoussé en terminale Formation terminale.
Sockets/rmi - Y. Bekkers1 Applications réparties en Java Paquetage java.net – Sockets Objets distants transparents – RMI Yves Bekkers.
Un outil spécifique à Moodle pour le calcul des indicateurs d’interaction Présenté par : Tarek DJOUAD Laboratoire LIRIS, Lyon1 Équipe SILEX
1 Adaptation Structurelle de Composants Logiciels Stage de DEA informatique effectué à L’ENSM-Douai Encadré par Mr. Abdelhak SERIAI & Mr. Mourad OUSSALAH.
UML : méthode Processus. Introduction(1) ● Cycles ● Spécification par cas d'utilisation ● Identifier les besoins ● Analyse par cas d'utilisation ● Affiner.
Introduction à la Programmation Orientée Objet H.GATI.
Thème TIPE 2016 Structures : organisation, complexité, dynamique. L'adéquation du sujet choisi par l'étudiant au thème de l'année s'opérera par l'une ou.
Principes avancés de conception objet Jean-Jacques LE COZ.
Principes de l'orienté objet Jean-Jacques LE COZ.
Les limites de l’UML Présenté par : Samah Dekhil 1.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Cours de Langage C Les structures
Introduction Depuis le début des sites web les urls sont utilisé pour la navigation. Avec l’arrivée des bases de données, les urls ont prit de l’importance.
Introduction à l'orienté objet. Définition Le terme orienté objet siginifie que l'on organise le logiciel comme une collection d'objets organisée en graphe.
JAVA et POO : Notion d'héritage
Développement d’applications interactives
INTERFACE ET POLYMORPHISME
TP N°5: Partie I Programme Serveur.
Transcription de la présentation:

Spécialisation covariante cours et TP

Plan  Introduction  Rappels théoriques  Définition de la covariance  Présentation du modèle servant d'exemple  Comportement par défaut de Java  Implémentation du comportement covariant en Java  Conclusion

Rappels (1)  Quel est le mécanisme qui permet aux méthodes des magasins concrets de se comporter différemment ?  Polymorphisme

Rappels (2)  Les objets Client ne connaissent que les types abstraits Magasin et Paiement.

 Covariance : définition  Polymorphisme multiple Sur-classe ( abstraite ) Méthode ( argument) Spécialisation des méthodes Spécialisation des classes Spécialisation des arguments Sous-classes ( concrètes ) Méthodes spécialisées ( argument spécialisé)

Modèle exemple  Modèle de référence pour la suite de la démonstration

Covariance : supportée ?  Langages orientés objet supportant la covariance  Eiffel, CLOS  Langages orientés objet ne supportant pas la covariance  Java, C++, Python

But du cours  Montrer que Java ne supporte pas la covariance  Proposer une implémentation en Java  Simulant la covariance  Pour des méthodes avec un seul argument covariant  Le modèle exemple servant de modèle de classes pour l'implémentation (à utliser pour le TP qui suit)

Types déclarés et types inhérents Magasin objet_mag = new McDonalds( ); type déclarétype inhérent

Surcharge et polymorphisme en Java surcharge (signatures différentes) polymorphisme (même signature)

Conversions en Java (1)  Conversion d'un sous-type en sur-type (« upcast »)  McDonalds macdo = new McDonalds();  Magasin mag = (Magasin) macdo;  Toujours possible

Conversions en Java (2)  Conversion d'un sur-type en sous-type(« downcast »)  Impossible si le type inhérent et le type déclaré sont les mêmes  Magasin mag = new Magasin();  McDonalds macdo = (McDonalds) mag; // impossible  Possible si le type inhérent est le même que le type de la conversion  Magasin mag = new McDonalds();  McDonalds macdo = (McDonalds) mag; // possible

Magasin mag = new Magasin(); McDonalds mac = new McDonalds(); Magasin macMag = new McDonalds(); Paiement paiement = new Paiement(2.00); Liquide liquide = new Liquide(2.00); Paiement liquidePaiement = new Liquide(2.00); Méthode invoquée mag.accepte(paiement) mag.accepte(liquide) mag.accepte(liquidePaiement) mac.accepte(paiement) mac.accepte(liquide) mac.accepte(liquidePaiement) macMag.accepte(paiement) macMag.accepte(liquide) macMag.accepte(liquidePaiement) Invariance* Covariance** Magasin.accepte(Paiement) McDonalds.accepte(Liquide) Magasin.accepte(Paiement) McDonalds.accepte(Liquide) Magasin.accepte(Paiement) McDonald.accepte(Liquide) Magasin.accepte(Paiement) Méthode exécutée Magasin.accepte(Paiement) (*) comportement par défaut de java (**) comportement recherché

Problèmes  Comportement de Java par défaut dans ce cas:  Aucun comportement polymorphe  Comportement de surcharge quand les types sont explicites  Conversion implicite dans les autres cas  Java va à la facilité, il ne descend pas dans l'arbre d'héritage pour trouver la méthode adéquate

Solution en Java  Technique  Basée sur les mécanismes de reflexion de Java  package reflect  mécanisme dynamique ( runtime)  La solution doit respecter le modèle objet  La solution ne doit pas affecter le comportement du modèle

Implémentation (1)  Algorithme 1. Implémentation dans la méthode accepte de Magasin  void accepte(Paiement) 2. Déterminer le type inhérent de l'argument  avec la méthode getClass() du package Class  appliquée à l'argument 3. Déterminer le type inhérent du receveur  avec la méthode getClass() du package Class  appliquée à l'objet (this : le receveur)

Implémentation (2) 1. Récupérer la méthode à invoquer  avec la méthode getDeclaredMethod() du package reflect 1. appliquée au type inhérent de l'objet 2. Invoquer la méthode 1. avec la méthode invoke() du package reflect 2. appliquée à la m éthode

Implémentation (3)  Extrait du code Java public abstract class Magasin { public void accepte(Paiement paiement) { try { Class typeInherentArgument[ ] = { paiement.getClass() } ; Class typeInherentReceveur = this.getClass() ; Method lamethode = typeInherentReceveur.getDeclaredMethod(''accepte'', typeInherentArgument) ; Object args[ ] = {paiement}; lamethode.invoke(this, args); } catch (Exception e) {... } }

Test (1)  Faire dériver de Magasin les classes McDonalds et Auchan class McDonalds extends Magasin { public void accepte (Liquide liquide) { System.out.println( ''accepte le liquide '') ; } class McDonalds extends Magasin { public void accepte (Liquide liquide) { System.out.println( ''accepte le liquide '') ; } public void accepte ( CarteBancaire cb) { System.out.println( ''accepte les cartes bancaires '') ; }

Test (2)  La méthode main public static void main ( String arg[ ] ) { Paiement li = new Liquide(5.50) ; Paiement cb = new CarteBancaire(250.20) ; Magasin macMag = new McDonalds() ; macMag.accepte(li) ; Magasin auchMag = new Auchan() ; auchMag.accepte(li) ; auchMag.accepte(cb) ; }

Conclusion  Technique relativement transparente  Non gourmande en ressources  Respecte le modèle objet initial  Permet à Java de supporter la covariance  Le mécanisme peut être pris en compte dès la modélisation (diagramme de classe)  L'accès au méta-modèle objet avec le mécanisme de réflexion est un « must » du langage Java

Solution avec « double dispatch »  Le double dispatch  Basé sur le patron de conception (design pattern) « Visiteur »  Fort couplage entre les classes qui acceptent le visiteur et les classes qui implémentent les visiteurs

Solution avec « double dispatch » Polymorphisme A B C D

Solution avec « double dispatch »  Le cycle de vie du double dispatch  Appels A, B (premier dispatch)  Détermination du type inhérent de l'objet argument de la méthode accepte(arg) (du visiteur; ici CB ou Liquide)  Appels C, D (deuxième dispatch)  Détermination du type inhérent de l'objet sur lequel est invoquée la méthode accepte() (du visité; ici McDonalds ou Auchan)