Objectifs. Concepts. Etude de cas. EPFL 2015 Jean-Cédric Chappelier & Jamila Sam. Programmation II Polymorphisme 2 1 / 17. Objectifs.

Documents pareils
Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Objets et Programmation. origine des langages orientés-objet

Programmer en JAVA. par Tama

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Installer un espace de travail collaboratif et d e learning.

FÊTE DE LA SCIENCE 2005 (Village des Sciences)

INITIATION AU LANGAGE JAVA

Initiation à JAVA et à la programmation objet.

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Cours 1: Java et les objets

Conventions d écriture et outils de mise au point

TP1 : Initiation à Java et Eclipse

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

Héritage presque multiple en Java (1/2)

L enseignement de méthodes agiles dans un contexte d apprentissage actif

Tp 1 correction. Structures de données (IF2)

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

et Programmation Objet

Architecture des ordinateurs

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Je découvre le diagramme de Venn

La programmation orientée objet et le langage C++

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Utilisation du logiciel GALAAD

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

GOL502 Industries de services

Cours d initiation à la programmation en C++ Johann Cuenin

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

Machines virtuelles Cours 1 : Introduction

Guide plateforme FOAD ESJ Lille

F. Barthélemy. 17 mai 2005

TD/TP PAC - Programmation n 3

Ch.G3 : Distances et tangentes

Epreuve écrite d admissibilité du Mercredi 15 Janvier 2014 DOSSIER REPONSE

Comparer des surfaces suivant leur aire en utilisant leurs propriétés géométriques Découverte et manipulation

Premiers Pas en Programmation Objet : les Classes et les Objets

Guide des autorisations d urbanisme

Utilisation d'interwrite avec un vidéoprojecteur interactif EPSON

Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

PROBLEME(12) Première partie : Peinture des murs et du plafond.

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

L espace de travail de Photoshop

Comment envoyer un en gardant les adresses de ses correspondants confidentielles!!!

Préparation à l installation d Active Directory

1 Introduction à l infrastructure Active Directory et réseau

Programmation Orientée Objet

5. Excel 2010, le tableur collaboratif. a. Concevez des tableaux lisibles

openarchitectureware & transformation de modèle Yannick Lizzi Architecte Logiciel itemis France Mail: lizzi@itemis.de

LOG4430 : Architecture et conception avancée

27 septembre h 00 à 16 h 30 Hôtel Universel, Rivière-du-Loup

Chapitre 2. Classes et objets

Une introduction à Java

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

PROJET 1 : BASE DE DONNÉES REPARTIES

Concept de machine virtuelle

Génie Logiciel avec Ada. 4 février 2013

10 tâches quotidiennes que devrait maîtriser votre système de sauvegarde des données

2. Comprendre les définitions de classes

Dévéloppement de Sites Web

Plan Pédagogique du cours

Cours de numérisation sur Epson Perfection

LES TROUBLES DU GRAPHISME LA RÉÉDUCATION: QUAND ET COMMENT PASSER PAR L ORDINATEUR?

Adobe Illustrator Logiciel de dessin vectoriel et de Cartographie Assistée par Ordinateur

Raja Bases de données distribuées A Lire - Tutoriel

5-1/4" 5-1/4" 5/8" 2-1/2" 3/4" Ligne A. Figure 1. Ligne B. Ligne C. Entaille 1-1/2" Figure 2

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Créer un site Internet dynamique

WHITE PAPER. Quels avantages la déduplication offre-t-elle aux entreprises? Livre blanc Acronis

LA NOTATION STATISTIQUE DES EMPRUNTEURS OU «SCORING»

INFO-F-105 Language de programmation I Séance VI

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

GUIDE DE L ENSEIGNANT

CMS Modules Dynamiques - Manuel Utilisateur

TP : Gestion d une image au format PGM

Conception des systèmes répartis

Evaluation diagnostique de CM1 Circonscription de Saint Just en Chaussée Livret du maître partie Français

Bien architecturer une application REST

Dans l idéal, ceci devrait être fait en amont pour chaque image envoyée sur l espace de stockage de votre site internet.

modélisation solide et dessin technique

Activité 1 : Création et Clonage d'une première machine virtuelle Linux OpenSuSE.

PRESENTATION DU LOGICIEL

Gestion mémoire et Représentation intermédiaire

Java Licence Professionnelle CISII,

Sécurité et Firewall

Cours 1 : La compilation

Consigne : je remplis le tableau en tenant compte des informations de la ligne supérieure et de la colonne de gauche (droite pour les gauchers)

PROGRAMMATION I & II. Présentation générale des cours

WHITEPAPER. Quatre indices pour identifier une intégration ERP inefficace

UML. Diagrammes de classes (suite) Delphine Longuet.

TD : Codage des images

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Transcription:

de la leçon d aujourd hui Programmation II : Cours d introduction à la programmation orientée objet Polymorphisme, 2 re partie fondamentaux Étude de cas Laboratoire d Intelligence Artificielle Faculté I&C Programmation II Polymorphisme 2 1 / 17 Programmation II Polymorphisme 2 2 / 17 Organisation du travail (semestre) fondamentaux Comme la semaine passée : notion de polymorphisme ( jamais «tests de type») virtual + pointeur/référence méthodes virtuelles pures et classes abstraites Application typique : collections hétérogènes : nécessité de pointeurs lesquels? quelle interface? copie polymorphique (complément de cours) Programmation II Polymorphisme 2 3 / 17 Programmation II Polymorphisme 2 4 / 17

Virtualité des destructeurs...mais avant ça une question : Destructeurs : virtuels ou non? Pourquoi? Retour et continuation de l exemple des dessins (2 derniers transparents du MOOC) : considérons un programme de modélisation graphique manipulant des dessins, lesquels sont des ensembles de figures géométriques. Classiquement on aura : Figure comme classe abstraite, avec différentes sous-classes concrètes (cercles, rectangles, carrés,...) Dessin comme collection hétérogène de figures. Les figures étant abstraites, on a donc bien une collection hétérogène et donc pas le choix pour le contenu du tableau dynamique : pour avoir du polymorphisme, il faut des pointeurs. La question est : quels pointeurs? et comment les gérer? Programmation II Polymorphisme 2 5 / 17 Programmation II Polymorphisme 2 6 / 17 Conception Interface? Questions à se poser : qui est «propriétaire» du contenu? quel est le statut du contenu : personnel ou partagé? Autre question : En clair, une figure dans un dessin donné est elle universelle (partagée par d autres dessins) ou spécifique à ce dessin précis? Par exemple, si je colorie en rouge le cercle 23 du dessin 18, est-ce que seul ce cercle sera rouge ou bien d autres? du même dessin? d autres dessins? Les réponses à ces questions dépendent du cadre général du programme et de sa conception, et n ont pas de réponse unique. Dans le cadre choisi ici (dessins), il semble naturel que les éléments de la collection (les figures) soient uniques et personnels. OUI, ou NON? doit-on ou non montrer les pointeurs (à l extérieur)? Programmation II Polymorphisme 2 7 / 17 Programmation II Polymorphisme 2 8 / 17

Montrer les pointeurs Cacher les pointeurs Si non, alors on aura des prototypes du genre Si oui, alors on aura des prototypes du genre void Dessin::ajoute(Figure* nouvelle); MAIS cela supposera : (il faudra que l utilisateur de la classe Dessin y fasse bien attention! risques de mauvaise programmation) ➀ que l on ajoute à chaque fois une nouvelle instance de figure ; typiquement : mondessin.ajoute(new Cercle(etc.)); ➁ que le propriétaire (nous ou l utilisateur de la classe, en fonction de la réponse à la première question) s occupe de la gestion mémoire (ne pas oublier les delete, ne pas les faire trop tôt non plus). void Dessin::ajoute(Figure const& nouvelle); MAIS cela supposera : ➀ que l on s occupe (nous) de la gestion mémoire (ce qui est plutôt bien car plus localisé, donc moins de risque d erreur) ; ➁ que l on fasse à chaque fois une copie de la figure géométrique reçue comme exemple (puisque l on est dans le cadre «unique et personnel») ; typiquement avoir une copie profonde polymorphique au niveau des Figures. class Figure... virtual Figure* copie() const = 0;... class Cercle : public Figure... virtual Cercle* copie() const return new(cercle(*this));... On parle de «retour covariant» (covariant return) Programmation II Polymorphisme 2 9 / 17 Programmation II Polymorphisme 2 10 / 17 Retour sur les collections hétérogènes Autre question, en : quel type pointeur? «à la C» (Figure*) gestion «à la main» de la désallocation mémoire unique_ptr recommandé, mais attention à l aspect «unique». Exemple : parcours de la collection : for (auto & el : collection) ou for (auto const& el : collection) Par ailleurs les unique_ptr ne peuvent pas être covariants :-( peut utiliser le truc suivant : unique_ptr<cercle> Cercle::cloneMe() const return unique_ptr<cercle>(new Cercle(*this)); virtual unique_ptr<figure> Cercle::copie() const return cloneme(); Mais on Retour sur les collections hétérogènes Dernière question : le dessin est-il ou bien a/possède-t-il un tableau dynamique de figures? Nous vous conseillons ici de choisir l encapsulation (le dessin possède un tableau de figures). Par exemple :... [hors cours] shared_ptr déconseillé ici et attention aux pièges Programmation II Polymorphisme 2 11 / 17 Programmation II Polymorphisme 2 12 / 17

Pour résumer (1/3) Voici un exemple possible avec unique_ptr et copie polymorphique : utilisation : dessin.add(c); (pour un Cercle c; existant) void add(figure const& objet) contenu.push_back(objet.copie()); virtual ~Dessin() Pour résumer (1/3, suite) class Figure virtual unique_ptr<figure> copie() const = 0; class Cercle unique_ptr<cercle> Cercle::clone() const return unique_ptr<cercle>(new Cercle(*this)); // voire une méthode template... (plus tard dans le cours) virtual unique_ptr<figure> Cercle::copie() const return clone(); Programmation II Polymorphisme 2 13 / 17 Programmation II Polymorphisme 2 14 / 17 Pour résumer (2/3) Voici un exemple possible avec unique_ptr sans copie polymorphique : Pour résumer (3/3) Voici un exemple possible avec «pointeurs à la C» (sans copie polymorphique) : utilisation : dessin.add(new Cercle()); utilisation : dessin.add(new Cercle()); void add(figure* objet) if (objet!= nullptr) contenu.push_back(unique_ptr<figure>(objet)); virtual ~Dessin() void add(figure* objet) if (objet!= nullptr) contenu.push_back(objet); virtual ~Dessin() for (auto o : contenu) delete(o); // interdire la copie Dessin& operator=(const Dessin&) = delete; Dessin(const Dessin&) = delete; Dessin() = default; // remettre le cteur par défaut vector<figure*> contenu; Programmation II Polymorphisme 2 15 / 17 Programmation II Polymorphisme 2 16 / 17

Synthèse Au niveau de ce cours, je vous conseille (hors exercices courts et faciles) : Tant que faire se peut de donner la propriété à la collection et dans ce cas d utiliser des unique_ptr en gérés en interne de la collection (copie polymorphique) ou des pointeurs à la C, mais sinon (si vous ne pouvez pas donner la propriété à la collection ou ne vous sentez pas le niveau de faire de la copie polymorphique), de transférer des adresses d objets (extérieurs) existants au moins aussi longtemps que la collection elle-même (il faudra donc le garantir!) Programmation II Polymorphisme 2 17 / 17