Masters IIGLI et IGLII – Programmation générique et conception objet – 2005-2006 – Claude Montacié 1 Cours n° 3 Polymorphisme I.

Slides:



Advertisements
Présentations similaires
Programmation Orienté Objet en C++
Advertisements

Cours n° 1 Présentation du langage C++
Cours n° 2 Les entrées-sorties Biliothèque C++ (iostream) –
Cours n° 7 Standard Template Library II.
Cours n° 6 Standard Template Library I.
C++ 6ème cours Patrick Reuter maître de conférences
C++ 5ème cours Patrick Reuter maître de conférences
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.
Langages objet Définitions Traduction des méthodes en C++
Programmation Orientée Objet (POO)
Leçon 3 : Héritage IUP 2 Génie Informatique
Introduction à la POO: Les classes vs les objets
1 Une introduction à Java IFT 287 (Semaine 1). 2 Java - Historique Développé par Sun Microsystems en 1994 –Inventeur James Gosling (canadien!) Objectif.
Athapascan-1 Interface C++ de programmation parallèle
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
C++ : classes Introduction aux Langages Orientés Objets
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
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é.
Structures de données IFT-2000
Structures de données IFT Abder Alikacem La classe string Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Structures de données IFT-10541
Structures de données IFT-2000
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
Programmation Orienté Objet applications au langage Java
Introduction au paradigme orienté-objet (suite)
P. Van Roy, LINF1251 LINF1251: Le Langage Java Peter Van Roy Département dIngénierie Informatique, UCL
1 Fonction : surcharge de sélection La surcharge de sélection consiste à implanter plusieurs méthodes de même nom dans une même classe à condition que.
Introduction au C++ héritage / polymorphisme
Héritage Lhéritage permet de spécialiser une classe en définissant une relation de type « est une sorte de ». #include comptebancaire.h class CompteEpargne.
C++ : fonctions et opérateurs
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.
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 4 Polymorphisme II.
INF1101 Algorithmes et structures de données
Structures de données IFT-2000 Abder Alikacem L’héritage en C++ Département d’informatique et de génie logiciel Édition Septembre 2009.
Une introduction à Java
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 9 Interopérabilité logicielle I Entre C++
Les Types de données complexes
Héritage Licence Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier.
Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 10 Interopérabilité logicielle I Entre C++
Structures de données IFT-2000
Introduction à la programmation orientée objet
Chapitre X Modèles.
Chapitre IX Gestion de flux.
2.1 - Historique Chapitre 2 : Introduction au langage C++
Travaux Pratiques Représentation des connaissances
9ième Classe (Mardi, 4 novembre) CSI2572. H Nous avons vu comment utiliser les directives #define #ifndef #endif Pour s’assurer de l’inclusion unique.
La notion de type revisitée en POO
11/04/ L'héritage Cours 7 Cours 7.
Programmation objet La base.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Notions avancées du C++
Argc et argv Utilisation des paramètres de la ligne de commande.
Cours n° 1 Présentation du langage C++
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
PHP 7° PARTIE : PROGRAMMATION OBJET
C++ L’HERITAGE Fayçal BRAÏKI DUT INFORMATIQUE.
PHP objet Jérôme CUTRONA 10:13:27 Programmation Web
Les opérateurs L’amitié Les opérateurs Introduction
Les surcharges d'opérateurs
Les classes Introduction aux Langages Orientés Objets
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Conception de Programmes - IUT de Paris - 1ère année – Cours 6 - Les opérateurs L’amitié Les opérateurs –Introduction –Surcharge par fonction.
Chapitre VII Techniques plus avancées à travers le concept de classe.
Héritage Conception par Objet et programmation Java
Langage de Programmation Orientée Objet : C++
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Transcription de la présentation:

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 1 Cours n° 3 Polymorphisme I

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 2 1.Polymorphisme ad-hoc 1.1. Surcharge de méthodes 1.2. Surcharge des opérateurs 2.Polymorphisme d’inclusion 2.1. Héritage 2.2. Héritage multiple Sommaire

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 3 INTRODUCTION Résolution de problèmes Méthodologies de résolution de problèmes Problème spécifique (définition d’une unité logicielle spécifique) multiplication des unités logicielles spécifiques augmentation des erreurs et du temps de développement Cas particulier d’un problème plus général (spécialisation d’une unité logicielle générique ou réutilisation) Unité logicielle générique Indépendance de la définition de l’unité logicielle (e.g., fonction, classe, …) au contexte d’exécution (e.g., type des paramètres ou des fonctions) Instanciation de l’unité générique avec des types et/ou des fonctions Polymorphisme Possibilité pour un opérateur ou une fonction d'être utilisable dans des contextes différents et d'avoir un comportement adapté à ces paramètres. Polymorphisme ad-hoc = surcharge de méthodes Polymorphisme d’inclusion = héritage ou redéfinition Polymorphisme paramétrique = types génériques ou généricité

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DE METHODES Programmation modulaire Définition de deux fonctions de même nom avec des paramètres différents (type ou nombre). Par exemple, définition d’une fonction Maximum pour deux entiers, pour deux réels int Maximum(int i, int j){return i > j ? i : j;} float Maximum(float x, float y){return x > y ? x : y;} int main (int argc, char *argv[]) { float x, y; cout > x >> y; cout << Maximum(x, y) << endl; int i, j; cout > i >> j; cout << Maximum(i, j) << endl; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DE METHODES Programmation objet Définition de deux méthodes de même nom dans deux classes indépendantes. Par exemple, définition d’une méthode afficher pour les deux classes Image et Texte class Image { public : Image (); void afficher() const; }; class Texte { public : Texte (); void afficher() const; };

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DES OPERATEURS Principe Extension de la notion de la surcharge de fonction • Interprétation d’un opérateur comme d’un appel de fonction Ex: Equivalence pour le compilateur entre l’expression a+b et l’appel de add(a, b) Opérateurs surchargables • Binaire()[]-> • Unaire+-++--!~*& • Unairenewnew[]delete • Binaire*/%+- • Binaire > • Binaire >==!= • Binaire&^||&&! • Binaire=+=-=*=/=%= • Binaire &=^=|= >= • Binaire,

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHAGE DES OPERATEURS Syntaxes Surcharge externe d’opérateur • Redéfinition par une fonction externe à la classe • Accès aux attributs de classe Accesseurs (fonctions membres), Fonctions amies de la classe (qualificatif friend) Syntaxe type operator Op (type 1 var1 [,type2 var2]) • type1 ou type2 doivent des classes • « var1 Op var2 » interprétée comme « operator op (var1, var2) Surcharge interne d’opérateur • Redéfinition par une fonction membre • Syntaxe type operator Op([type 2 var2]) • « var1 Op var2 » interprétée comme « var1.operator op (var2)

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DES OPERATEURS Classe Complexe Deux attributs privés de type float : partie réelle et partie imaginaire Addition de deux complexes Surcharge interne de l’opérateur + Multiplication de deux complexes Surcharge interne de l’opérateur – Envoi sur un flot de sortie d’un complexe Surcharge externe de l’opérateur << méthode d’une autre classe (iostream) Lecture sur un flot d’entrée d’un complexe Surcharge externe de l’opérateur >> méthode d’une autre classe (iostream)

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DES OPERATEURS Définition de la classe Complexe class Complexe { private : float reel, imag; public : Complexe (float a, float b); // constructeurs Complexe (); float getreel() const; // accesseurs float getimag() const; Complexe operator + (const Complexe & y); // redéfinition de + Complexe operator * (const Complexe & y); // redéfinition de * // redéfinition par une fonction externe amie de la réception sur le flot d’entrée friend istream & operator >> (istream & S, Complexe & y); // redéfinition de l’envoi sur le flot de sortie friend ostream & operator << (ostream & S, const Complexe & y); } ; Complexe.h

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DES OPERATEURS Constructeurs, accesseurs et surcharge interne #include "Complexe.h" // constructeurs Complexe::Complexe (float a, float b) {reel = a; imag = b;} Complexe::Complexe () {reel = 0; imag = 0;} // accesseurs float Complexe::getreel () const {return reel;} float Complexe::getimag () const {return imag;} // surcharge interne de l'opérateur + Complexe Complexe::operator + (const Complexe & y) { Complexe c(0,0); c.reel = reel + y.reel; c.imag = imag + y.imag; return c; } // surcharge interne de l'opérateur * Complexe Complexe::operator * (const Complexe & y) { Complexe c(0,0); c.reel = reel*y.reel - imag*y.imag; c.imag = reel*y.imag + imag*y.reel; return c; } Complexe.cpp

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DES OPERATEURS Surcharge externe // surcharge externe de l’envoi sur le flot de sortie (fonction amie de la classe Complexe) ostream & operator << (ostream & S, const Complexe & y) { S << y.getreel() << " " << y.getimag() << endl; return S; } // surcharge externe de la réception sur le flot d’entrée (fonction amie de la classe Complexe) istream & operator >> (istream & S, Complexe & y) { S >> y.reel >> y.imag; return S; } Complexe.cpp

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié SURCHARGE DES OPERATEURS Test de la classe Complexe #include "Complexe.h" int main (int argc, char *argv[]) { Complexe Clx1, Clx2 (0.4, 0.92); cin >> Clx1; cout << Clx1 << Clx2 << Clx1+Clx2 << Clx1*Clx2; return 0; } Entrez un nombre complexe : testComplexe.cpp

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 13 Définition d’un nouvelle classe héritant des caractéristiques (attributs) et du comportement (méthodes) d’une classe existante Amélioration de la réutilisation (héritage de module) et de l’extensibilité (héritage de sous-typage) d’une application. Héritage de module (ou privée) Simple réutilisation du code de la classe parente dans la classe dérivée Classe d’analyse de texte par héritage d’un flot de texte en lecture Héritage de sous-typage (ou publique) Relation « est-un » entre les deux classes (« est un cas particulier ») Classe dérivée est un cas particulier de la classe parente dérivation d’un rectangle en carré 2. POLYMORPHISME D’INCLUSION Principe de l’héritage en C++

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 14 Class Fille : Mere Dérivation de la classe Mere en classe fille Droits d’accès aux attributs et aux méthodes accessibles (modificateur) pas de modifications des droits d’accès (public), restriction des droits d’accès aux seules classes dérivées (protected), pas de droits d’accès (private) Appels des constructeurs Appel par défaut d’un constructeur vide de la classe parente Transmission d’une liste d’arguments à un constructeur non-vide de la classe parente Fille::Fille (type1 arg1, type2 arg2,..) : Mere(arg1, arg2, …) Définition des méthodes Appel par défaut des méthodes de la classe parente Redéfinition possible de méthodes Appel explicite à la méthode de la classe parente (opérateur de portée) Mère::nom de la méthode(paramètres) 2.1 HERITAGE Syntaxe de l’héritage en C++

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE Syntaxe de l’héritage en C++ Animal.h class Animal { private: string espece; int nb_pattes; public: /** création d'une nouvelle instance de la classe Animal type nom de l'espèce pattes nombre de pattes */ Animal(string type, int pattes); /** présentation des caractéristiques de l'animal */ void presente(); /** cri de l'animal */ void crie(); };

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE Syntaxe de l’héritage en C++ Animal.cpp #include "Animal.h" /** création d'une nouvelle instance de la classe Animal type nom de l'espèce pattes nombre de pattes */ Animal::Animal(string type, int pattes) { espece=type; nb_pattes = pattes; } /** présentation des caractéristiques de l'animal */ void Animal::presente() { cout << "je suis un représentant de l'espèce des " << espece << " et j'ai " << nb_pattes << " pattes" << endl;} /** cri de l'animal */ void Animal::crie() { cout << "j'existe, donc je crie..." << endl; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE Syntaxe de l’héritage en C++ Felin.h #include "Animal.h" class Felin : public Animal { protected: /** est-ce un animal domestique ? */ bool domestique; public: /** Création d'une nouvelle instance de la classe Félin type espèce de félins */ Felin::Felin(string type); /** présentation des caractéristiques du félin */ void presente(); /** cri du félin */ void crie(); };

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE Syntaxe de l’héritage en C++ Felin.cpp #include "Felin.h" Felin::Felin(string type) : Animal (type, 4) { domestique = false; } /** présentation des caractéristiques du félin */ void Felin::presente() { Animal::presente(); string etat = (domestique) ? "domestique" : "sauvage"; cout << "je suis vraiment un animal " << etat << endl; } /** cri du félin */ void Felin::crie() { cout << "je rugis, et j'ai faim..." << endl; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié 19 Dérivation possible de plusieurs classes Class Fille : Mere1, Mere2 Dérivation des classes Mere1 et Mere2 en classe fille Appel de constructeurs Appel par défaut d’un constructeur vide de la classe parente Résolution des noms ambigus par l’utilisation de l’opérateur de portée Mère1::nom de la méthode(paramètres) Mère2::nom de la méthode(paramètres) 2.2 HERITAGE MULTIPLE Principes

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE MULTIPLE Syntaxe de l’héritage multiple en C++ Herbivore.h class Herbivore : public Animal { protected: bool ruminant; public: Herbivore::Herbivore(string type, int pattes, bool ruminant); void presente();}; class Carnivore : public Animal { protected: bool doux; public: Carnivore::Carnivore(string type, int pattes, bool doux); void presente(); }; Carnivore.h

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE MULTIPLE Syntaxe de l’héritage multiple en C++ Herbivore.cpp #include "Herbivore.h" /** Création d'une nouvelle instance de la classe Herbivore type espèce de Herbivore */ Herbivore::Herbivore(string type, int pattes, bool r) : Animal (type, pattes) { ruminant = r; } /** présentation des caractéristiques de l'herbivore */ void Herbivore::presente() { Animal::presente(); cout << "j'aime les légumes"; if (ruminant == true) cout << " et je rumine"; else cout << " et je ne rumine pas"; cout << endl; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE MULTIPLE Syntaxe de l’héritage multiple en C++ Carnivore.cpp #include "Carnivore.h" /** Création d'une nouvelle instance de la classe Carnivore type espèce de carnivore */ Carnivore::Carnivore(string type, int pattes, bool d) : Animal (type, pattes) { doux = d; } /** présentation des caractéristiques du carnivore */ void Carnivore::presente() { Animal::presente(); cout << "j'aime la viande"; if (doux == false) cout << " et je suis cruel"; else cout << " et je suis doux"; cout << endl; }

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE MULTIPLE Syntaxe de l’héritage multiple en C++ Omnivore.h #include "Herbivore.h" #include "Carnivore.h" class Omnivore : public Herbivore, public Carnivore { public: Omnivore::Omnivore(string type, int pattes); void presente(); void crie(); }; #include "Omnivore.h" Omnivore::Omnivore(string type, int pattes) : Carnivore (type, pattes, true), Herbivore(type, pattes, false) {} void Omnivore::presente() { Herbivore::presente();Carnivore::presente();} void Omnivore::crie() { Herbivore::crie(); } Omnivore.cpp

Masters IIGLI et IGLII – Programmation générique et conception objet – – Claude Montacié HERITAGE MULTIPLE Syntaxe de l’héritage multiple en C++ testOmnivore.cpp #include "Omnivore.h" int main() { Omnivore a("blaireaux", 4); a.presente(); a.crie(); } je suis un représentant de l'espèce des blaireaux et j'ai 4 pattes j'aime les légumes et je ne rumine pas je suis un représentant de l'espèce des blaireaux et j'ai 4 pattes j'aime la viande et je suis doux j'existe, donc je crie...