LIAISON DYNAMIQUE (1)



Documents pareils
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

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

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

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

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

as Architecture des Systèmes d Information

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Initiation à JAVA et à la programmation objet.

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

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

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

et Programmation Objet

Chapitre 2. Classes et objets

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

Langage Java. Classe de première SI

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

Premiers Pas en Programmation Objet : les Classes et les Objets

Java Licence Professionnelle CISII,

Plan Pédagogique du cours

JAVA TD0. Prise en main du langage Environnement de base JAVA 1

INITIATION AU LANGAGE JAVA

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

Une introduction à Java

Programmation Orientée Objet

Programmation Objet Java Correction

Chapitre VI- La validation de la composition.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Généralités sur le Langage Java et éléments syntaxiques.

Programmation en Java IUT GEII (MC-II1) 1

TP1 : Initiation à Java et Eclipse

TD/TP PAC - Programmation n 3

GOL502 Industries de services

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

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

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Claude Delannoy. 3 e édition C++

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)

TD/TP PAC - Programmation n 3

Avertissement : Ce cours suppose la connaissance et la maîtrise du langage C CONTENU DU COURS BIBLIOGRAPHIE

COMPARAISONDESLANGAGESC, C++, JAVA ET

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Conventions d écriture et outils de mise au point

Plan du cours. Historique du langage Nouveautés de Java 7

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

2. Comprendre les définitions de classes

Aide mémoire UML & Java 1ère partie : Introduction. marc.lemaire@u-cergy.fr

Traduction des Langages : Le Compilateur Micro Java

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

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

Java Licence Professionnelle CISII,

Programmation avec des objets : Cours 7. Menu du jour

Support de cours et TD Programmation Orientée Objet

Bases Java - Eclipse / Netbeans

Auto-évaluation Programmation en Java

C++ : PROGRAMMATION-OBJET

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Classe Interne, Anonyme & Enumération

Java c est quoi? Java pourquoi?

UML (Diagramme de classes) Unified Modeling Language

Programmation MacOSX / ios

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Cours 1: Java et les objets

2 e édition JAVA 5 et 6. Jérôme Bougeault. TSoft et Groupe Eyrolles, 2003, 2008, ISBN :

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

LE LANGAGE C++ ENAC 1997 A. DANCEL

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

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

TD3: tableaux avancées, première classe et chaînes

Programmation Orientée Objet application au langage Java Version Novembre 2007

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

Introduction à C++ et à wxwidgets

Généricité. en Java. (polymorphisme paramétrique) Philippe GENOUD UJF Janvier

Développement Logiciel

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

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

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

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

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Bases de programmation. Cours 5. Structurer les données

Chapitre 10. Les interfaces Comparable et Comparator 1

Corrigé des exercices sur les références

Java 1.5 : principales nouveautés

Introduction à l héritage en C++

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

1 Définition d une classe en Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

UML. Diagrammes de classes (suite) Delphine Longuet.

Application web de gestion de comptes en banques

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

UML et les Bases de Données

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

Introduction au langage C

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Facultés Universitaires Notre-Dame de la Paix. Conception et Programmation Orientées- Object

PROGRAMMATION PAR OBJETS

Présentation. Au programme. Fonctionnement. A l issue de ce module vous devriez...

Transcription:

LIAISON DYNAMIQUE (1) Problème : avec un pointeur de base (Employe *), on aurait besoin que la «bonne» méthode soit exécutée, en fonction du type dynamique de l objet pointé. Comment savoir quel est le type dynamique («réel») de l'objet pointé (Secretaire, Directeur,..)? Solution 1 : RTTI et dynamic_cast<>. A éviter! class Employe { protected: int salaire; int prime; char nom[50], prenom[50]; void paye() const { if ( dynamic_cast<secretaire *>(this) ) { cout << salaire; else if ( dynamic_cast<directeur *>(this) ) { cout << salaire + prime ; ; class Secretaire : public Employe { char directeur[50]; main() { Secretaire a1,a2; Directeur b1,b2; employe * tab[4]; tab[0]=&a1; tab[1]=&a2; tab[2]=&b1; tab[3]=&b2; // Valeurs des a1,a2... a1.paye(); b1.paye(); // OK: Employe::paye() affiche // ce qu'il faut grace au dynamic_cast<> for (int i=0; i<4; i++) tab[i]->paye(); Page 108/139

LIAISON DYNAMIQUE (2) Solution 2 : champ de type (à la C) : à éviter typedef enum { SECRETAIRE, DIRECTEUR, TYPE_EMPLOYE ; class Employe { protected: TYPE_EMPLOYE quijesuis; int salaire; int prime; char nom[50], prenom[50]; Employe(TYPE_EMPLOYE _quijesuis, ) { void paye() const { switch (quijesuis) { case SECRETAIRE : cout << salaire; break; case DIRECTEUR : cout << salaire+primes; break; ; class Secretaire : public Employe { char directeur[50]; // ATTENTION au constructeur Secretaire(): Employe( SECRETAIRE, ) { ; ; main() { Secretaire a1,a2; Directeur b1,b2; employe * tab[4]; tab[0]=&a1; tab[1]=&a2; tab[2]=&b1; tab[3]=&b2; // Valeurs des a1,a2... a1.paye(); b1.paye(); // OK: Employe::paye() sait toujours ce qui est manipulé for (int i=0; i<4; i++) tab[i]->paye(); Aucune de ces solutions n est satisfaisante! Page 109/139

LIAISON DYNAMIQUE. METHODE VIRTUELLE. (1) Liaison dynamique : mot clé virtual. 1. Déclarer une méthode d une super classe virtuelle 2. Redéfinir cette méthode dans les sous classes. la méthode exécutée sera celle de la classe du type dynamique de l objet et sera choisie automatiquement à l exécution. Syntaxe : class >ClasseMere> { virtual <prototype de méthode> ; Mécanisme sous-jacent Les fonctions virtuelles et le mécanisme de liaison dynamique sont implémentées par un tableau de pointeurs sur des fonctions et un champ entier indiquant le type de l objet. Page 110/139

LIAISON DYNAMIQUE. METHODE VIRTUELLE. (2) Exemple class Employe { protected: int salaire; char nom[50], prenom[50]; virtual void paye() const { cout << salaire; virtual void aff() const { cout << "Je suis "<<nom << " "<<prenom; ; Les autres classes ne changent pas! Eg, la méthode aff() de Secretaire reste : void Secretaire::aff() const { Employe::aff(); cout<<" dans le service de "<< nomdirecteur; Le main ne change pas : main() { Secretaire a1, a2; Directeur b1; Gerant c1; Employe * tab[4]; tab[0]=&a1; tab[1]=&a2; tab[2]=&b1; tab[3]=&c1; // Employe::aff() est virtuelle // => la méthode aff() exécutée est celle // du type dynamique («effectif») de l objet // quel que soit le type statique utilisé pour // manipuler l objet for (int i=0; i<100; i++) tab[i]->aff(); // les méthodes aff() exécutées sont celles de // Secretaire, Secretaire, Directeur puis Gerant. Page 111/139

CLASSE ABSTRAITE, METHODE VIRTUELLE PURE (1) Méthode virtuelle pure Méthodes qui ne peuvent avoir de sens ou dont le sens est incomplet Syntaxe : virtual type nom_methode (paramètres) = 0; Notion de classe abstraite Classe dont l implantation n est pas complète: Elle représente un concept abstrait Elle possede au moins une méthode virtuelle pure Il est impossible de créer un objet de cette classe. On peut utiliser un pointeur ou une référence sur une classe abstraite (polymorphisme). Exemples de classes abstraites Dans les exemples précédents du cours, typiquement : FORME serait une classe abstraite. FORME::dessiner() serait virtuelle pure. - On ne sait pas dessiner() une forme à ce niveau de la hiérarchie. - On ne peut écrire le code de dessiner que dans les sous-classes. Employe serait une classe abstraite Il n est pas possible d instancier un «Employe» sans plus de précision ; seules les sous classes peuvent être instanciées. Par exemple, Employe::afficher() serait virtuelle pure. Page 112/139

CLASSE ABSTRAITE, METHODE VIRTUELLE PURE (2) Exemple class FORME { protected: int X; int Y; virtual ~FORME() { ; // Impossible de dessiner à ce niveau => virtuelle pure virtual void dessine() = 0; virtual void aff()=0 { cout << "forme " << X << x ; ; // FORME est abstraite car a une méthode virtuelle pure class RECTANGLE : public FORME { int l; int L; void dessine(){ goto(x,y); draw_box(x,y,x+l,y+l); void aff(){ FORME::aff() ; cout << "rectangle " << l << L ; ; class ELLIPSE : public FORME { int ga; int pa void dessine(){ goto(x,y); draw_circle(x,y,ga,pa); void aff(){ FORME::aff() ; cout << "ellipse " << l << L ; ; main(){ FORME a; // IMPOSSIBLE : FORME est une classe abstraite ELLIPSE b; // OK b.dessine(); // ELLIPSE::dessine() FORME *p = &b; p->dessine(); // OK, ELLIPSE::dessine() Page 113/139

CLASSE ABSTRAITE PURE Classe abstraite pure Classe qui n a aucune méthode concrete et ne declare aucun attribut. Définit un contrat : oblige à avoir une API commune o toutes les sous classes doivent implanter toutes les méthodes déclarées dans la super classe. Equivalente à la notion d Interface en UML ou Java... Exemple La classe abstraite pure Motorisé declare une méthode allumermoteur(). On peut avoir un conteneur d objets motorisés et démarrer tous ces objets. class Motorise { virtual ~Motorise() { // nécessaire... virtual void demarrer() = 0 ; ; class Voiture : public Motorise { Voiture() { cout<<"constructeur Voiture "<<endl; ~Voiture() { cout<<"destructeur Voiture "<<endl; virtual void demarrer(){cout<<"demarrer Voiture"<<endl; ; class Perceuse : public Motorise { virtual void demarrer(){cout<<"demarrer Perceuse"<<endl; ; void demarrertabmotorises(motorise * tab[], int n) { for (int i=0; i<n ; i++) { tab[i]-> demarrer(); int main() { Motorise * tabmotorise[2]; tabmotorise[0] = new Voiture(); tabmotorise[1] = new Perceuse (); demarrertabmotorises(tabmotorise, 2); for (int i=0; i<2 ; i++) { delete tabmotorise[i]; Page 114/139

HERITAGE ET CYCLE DE VIE : DESTRUCTEUR VIRTUEL Exemple problématique class Base { Base() { cout<<"constructeur Base "<<endl; ~Base( ){ cout<<"destructeur Base"<<endl; ; class Derivee : public Base { Derivee() { cout<<"constructeur Derivee "<<endl; ~Derivee() { cout<<"destructeur Derivee "<<endl; ; int main() { Base * b = new Derivee; // OK! delete b; // delete d un objet Derivee // au moyen d un pointeur de type Base! Que se passe-t-il? Ou est le problème? Destructeur virtuel Conseil : le destructeur d une classe de base (dont derivent d autre classes) doit avoir un destructeur virtuel. class Base { Base() { cout<<"constructeur Base "<<endl; virtual ~Base( ){ cout<<"destructeur Base"<<endl; ; Le programme precedent affiche alors : Constructeur Base Constructeur Derivee Destructeur Derivee Destructeur Base Page 115/139

HERITAGE ET CYCLE DE VIE : COPIE ET AFFECTATION Constructeur par copie et opérateur d affectation Imposer et respecter l ordre hierarchique de construction : le constructeur par copie de la classe dérivée doit appeler le contructeur par copie de la classe mère. l opérateur d affectation de la classe dérivée doit appeler l opérateur d affectation de la classe mère. Exemple class A { A() { cout <<"A::A ; " ; A(const A & other) { cout <<"A::A(copy) ; " ; A& operator=(const A& other) { cout <<"A::operator= ; "; return *this ; virtual ~A() { cout <<"A::~A " <<endl ; ; class B : public A{ B() : A() { cout <<"B::B" <<endl; B(const B & other): A(other) {cout <<"B::B(copy)"<<endl; B& operator=(const B& other) { A::operator=(other); cout <<"B::operator=" <<endl; return *this ~B() { cout << "B::~B ; " ; ; A::A ; B::B main() { A::A(copy) ; B::B(copy) B b; A::A ; B::B B b2(b) ; A::operator= ; B b3; B::operator= b3 = b; B::~B ; A::~A B::~B ; A::~A B::~B ; A::~A Page 116/139

HERITAGE ET CYCLE DE VIE : POLYMORHISME ET METHODE CLONE() Le problème Avec les classes A et B precedents, polymorphisme et copies d objets main() { B b; A * pa = &b;//polymorphisme: on manipule B comme un A B b5(*pa); //ERREUR! Pas de B::B(const A &)! Méthode vritual clone() Dans les hiérarchie de classe, pouvoir faire des copies d objets polymorphes, on définit souvent une méthode clone() comme suit : class FIGURE { virtual FIGURE * clone() const = 0 ; ; class CERCLE : public FIGURE { virtual FIGURE * clone() const { return new CERCLE(*this); ; main() { FIGURE * pf = new CERCLE() ; FIGURE * pf2 = pf ->clone(); // le type dynamique de *pf2 est bien CERCLE! // combien y a t il d'objets CERCLE en mémoire? Page 117/139

HERITAGE MULTIPLE Un concept peut avoir des points communs avec plusieurs autres concepts : il doit alors hériter de ces divers concepts : héritage multiple. L'héritage multiple concerne aussi bien les champs que les méthodes. Syntaxe : class derivee : <public,private> base1, <public,private> base2 { ; Attention : l'héritage est statique : il ne doit pas y avoir d'ambiguïté sur les méthodes. Les classes A et B ne doivent pas avoir une méthode de nom identique; Dans le cas contraire, il faut spécifier complètement le nom de fonction lors de l'appel. Exemple class A { public : void m1() { ; ; class B { public : void m1() { ; ; class C : public A, public B { ; main() { C x; x.m1(); x.a::m1(); x.b::m1(); // ERREUR : ambiguïté // OK //OK Page 118/139

HERITAGE MULTIPLE D UNE MEME CLASSE L'héritage multiple d'une même classe est interdit. L'héritage indirect multiple d'une même classe est autorisé. La classe de base est alors dupliquée 2 fois. main() { C x; x.c = x.d= x.b = 0; // OK x.a=0; //ERREUR : ambiguïté x.d::a = x.b::a = 0; // OK Page 119/139

HERITAGE MULTIPLE ET PARTAGE. HERITAGE VIRTUEL L'héritage multiple peut être vu comme une manière de rassembler des classes pour en créer de nouvelles plus complexes, pour intégrer des outils développés séparément. Autre situation : développer des classes fortement liées entre elles, partageant des propriétés => héritage indirect d'une même classe de base, sans duplication de l'objet de base (classe iostream qui dérive de istream et ostream) Pour ce cas : héritage virtuel Syntaxe class classe_dérivée : public virtual classe_base { ; : private Remarques Constructeur : le constructeur de C doit passer les arguments aux constructeurs de D et B, mais aussi aux constructeurs de la classe de base virtuelle A. Le constructeur de la classe de base virtuelle est toujours appelé avant les autres Page 120/139

HERITAGE MULTIPLE ET PARTAGE. HERITAGE VIRTUEL Exemple class FENETRE { public : int X; int Y; ; class MENU : public virtual FENETRE { int nb_lignes; MENU (..) { // Constructeur ; class F_COUL : public virtual FENETRE { int couleur; F_COUL (..) { // Constructeur ; class F_MENU_COUL : public MENU, public F_COUL { public : F_MENU_COUL (...): FENETRE (...) { F_COUL (...), MENU (...), ; ; Page 121/139