Héritage Concepts généraux des classes dérivées. Les concepts de base de la POO Application en C++ Héritage Concepts généraux des classes dérivées



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

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

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

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

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

Chapitre 2. Classes et objets

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

Programmer en JAVA. par Tama

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

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

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

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Plan Pédagogique du cours

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

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

TP1 : Initiation à Java et Eclipse

TD/TP PAC - Programmation n 3

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

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

Bases Java - Eclipse / Netbeans

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

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

as Architecture des Systèmes d Information

Programmation par les Objets en Java

Programmation Objet - Cours II

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

Initiation à JAVA et à la programmation objet.

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

I. Introduction aux fonctions : les fonctions standards

Programmation avec des objets : Cours 7. Menu du jour

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

Langage Java. Classe de première SI

Java Licence Professionnelle CISII,

Classes et Objets en Ocaml.

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)

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

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

Cours 1: Java et les objets

Premiers Pas en Programmation Objet : les Classes et les Objets

TP1. Outils Java Eléments de correction

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

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

TD/TP PAC - Programmation n 3

Introduction à C++ et à wxwidgets

Programmation en Java IUT GEII (MC-II1) 1

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

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

2. Comprendre les définitions de classes

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Une introduction à Java

Programmation Objet Java Correction

Auto-évaluation Programmation en Java

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

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

Chapitre 10. Les interfaces Comparable et Comparator 1

INITIATION AU LANGAGE JAVA

CPR Informatique. (poste 3159 ou 3164) Septembre 2002

Création d objet imbriqué sous PowerShell.

Le stockage local de données en HTML5

Java c est quoi? Java pourquoi?

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

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Arbres binaires de recherche

GOL502 Industries de services

Cours Programmation Système

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

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

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


TP, première séquence d exercices.

Utilisation d objets : String et ArrayList

Programmation C++ (débutant)/instructions for, while et do...while

Présentation du langage et premières fonctions

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Introduction à l héritage en C++

Programmation Orientée Objet

Introduction au langage C

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

Chapitre VI- La validation de la composition.

1 Lecture de fichiers

PROJET 1 : BASE DE DONNÉES REPARTIES

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 )

Support de cours et TD Programmation Orientée Objet

UML. Diagrammes de classes (suite) Delphine Longuet.

Pourquoi l apprentissage?

et Programmation Objet

Algorithmique et Programmation, IMA

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Annexe : La Programmation Informatique

Traduction des Langages : Le Compilateur Micro Java

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Recherche dans un tableau

Java Licence Professionnelle CISII,

Cours 6 : Tubes anonymes et nommés

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Le prototype de la fonction main()

Chapitre 1 : Introduction aux bases de données

Transcription:

Les concepts de base de la POO Application en C++ Classes abstraites Possibilité de définir de nouveaux objets à partir des objets existants Hiérarchie de généralisation/ spécialisation Une classe descendante hérite des propriétés de son père (attributs et méthodes) Elle peut être spécifiée : par enrichissement par rapport à son père (ajout de nouveaux champs ou ajout de nouvelles méthodes) par substitution i.e. redéfinition de certaines méthodes (et par héritage direct de certaines autres), 1 2 Les droits en héritage Pour définir une classe comme héritière d'une autre classe, il faut indiquer le nom de la classe ancêtre et les droits d'héritage Ces droits d'héritage peuvent être : public Les membres sont hérités avec les droits d'accès de leur classe de base (excepté les membres privés de la classe ancêtre qui sont inaccessibles dans la classe héritière ) private Les membres sont hérités avec des droits d'accès restreints par rapport à ceux de leur classe de base (en fait tout membre hérité devient privé, c'est le mode implicite d'héritage). La syntaxe de définition d'une classe héritière : class classe_derivee : mode_héritage classe_ancêtre { déclarations des nouveaux membres ; 3 4 On souhaite définir une classe "complexe_h" comme dérivée de la classe "complexe". class complexe { private : int i,r; complexe(void); complexe(int, int); void ecrire( int, int ) ; int lire_i(void); int lire_v(void) ; ; Un complexe_h est un complexe (avec une partie réelle et une partie imaginaire) et des méthodes de manipulation (héritées de "complexe"). Un "complexe_h" est spécialisé par rapport à "complexe" par : l'ajout d'un membre champs "valide" : entier qui indique si le complexe peut être représenté à l écran en considérant ses valeurs (r et i) comme ses coordonnées à l écran (x, y) l ajout d une méthode membre "lire_v" d observation du champs valide - la substitution (redéfinition) de la méthode "ecrire". 5 6 1

class complexe_h : public complexe { private : int valide; complexe_h(void); complexe_h(int, int); void ecrire(int, int) ; int lire_v(void); ; void complexe_h :: ecrire (int vr, int vi) { complexe :: ecrire(vr,vi); // appel de la méthode ecrire de la classe complexe if ((vr < 640) && (vr>=0) && (vi <480) && (vi>=0)) valide = 1; else valide =0; int complexe_h :: lire_v(void) { return (valide); 7 8 Constructeurs et héritage Lorsque le constructeur d une classe héritière est appelé, le constructeur de la classe mère doit également être appelé. On a successivement : appel du constructeur de la classe mère appel des constructeurs des membres de la classe héritière exécution des instructions du corps du constructeur de la classe héritière Sans indication particulière, c est le constructeur par défaut de la classe mère qui est appelé. 9 appel explicite du constructeur par défaut de la classe complexe complexe_h :: complexe_h(void) : complexe() {valide = 1; appel du constructeur avec paramètres de la classe complexe complexe_h :: complexe_h(int vr,int vi) : complexe(vr,vi) {if ((vr < 640) && (vr>=0) && (vi <480) && (vi>=0)) valide = 1; else valide =0; 10 multiple Le mécanisme d héritage n est pas limité à un ancêtre par descendant. Ainsi, un classe dérivée peut être issue de 2 (ou plusieurs) classes ancêtres. La spécification des ancêtres se fait en donnant leur liste lors de la déclaration de la classe dérivée. multiple Supposons que l on dispose d une classe «enseignant» et d une classe «chercheur» et l on souhaite créer une classe héritière «enseignant_chercheur» class enseignant_chercheur : public enseignant, public chercheur Il y a héritage des membres (champs et méthodes ) de chacune des classes ancêtres enseignant chercheur enseignant_chercheur 11 12 2

multiple multiple La possibilité de définir des mécanismes d héritage multiple peut conduire à des ambiguïtés class enseignant { char grademax];... void lire_grade(char *); ; class chercheur { char grade[max];... void lire_grade(char *); ; class enseignant_chercheur : public enseignant, public chercheur {...; 13 Existence de méthodes ancêtres ayant des noms identiques L ambiguïté peut être levée en précisant explicitement la classe ancêtre considérée lors de l appel opérateur de résolution de portée (::) 14 multiple enseignant_chercheur ec; déclaration d un enseignant_chercheur ec.enseignant:: lire_grade(mot); mot est le grade de l enseignant ec.chercheur:: lire_grade(mot); mot est le grade du chercheur multiple Une classe dérivée peut avoir dans ses ascendants plusieurs fois la même classe de base. L ambiguïté concerne le «partage» de la classe père. enseignant personne enseignant_chercheur chercheur 15 16 multiple Y-a-t-il un seul objet de la classe père ou deux indépendants? Pour obtenir un seul objet de la classe «père», les classes dérivées «enseignant» et «chercheur» peuvent être définies comme virtuelles : class enseignant : public virtual personne class chercheur : public virtual personne lors de la définition de la classe «enseignant_chercheur». multiple Le rôle de virtual est de signaler au compilateur que les classes héritières de ces classes virtuelles nécessitent un traitement spécial suppression des classes ancêtres en double Un objet est alors vu comme : un unique objet de la classe personne et les spécificités des classes enseignant et chercheur. 17 18 3

Le polymorphisme est un mécanisme puissant, très utile dans la spécialisation d'une hiérarchie d'objets. L'idée intuitive est de permettre l'application d'une "même" opération à des objets différents. La mise en oeuvre de cette propriété est réalisée par deux mécanismes en C++ : la surcharge l'édition de liens dynamique (ligature dynamique) 1 er cas : la surcharge La surcharge offre la possibilité de définir des méthodes homonynes (même nom et mêmes paramètres) pour des objets de type différents. 19 20 2 ème cas : la ligature dynamique Ce mécanisme est encore plus puissant que la surcharge car il permet : en cas d'ambiguité sur le choix de la méthode homonyne à utiliser, de différer cette décision jusqu'au moment de l'appel de la méthode Génération de tous les codes possibles, et décision lorsqu'on connaît la classe de l'objet à traiter Exemple (ligature dynamique) On considère tout d abord une classe «point». Un point est caractérisé par ses coordonnées (X,Y)et un ensemble de méthodes pour le manipuler. class point { int x,y; public point(void); // construteur int lire_x(void); // méthode d observation de x int lire_y(void); // méthode d observation de y void ecrire(int,int); // affectation de x et y ; 21 22 On souhaite définir une classe "pixel" comme dérivée de la classe "point". Un pixel est donc un point (avec des coordonnées X et Y) et des méthodes de manipulation (héritées de "point"). Un "pixel" est spécialisé par rapport à "point" par : l'ajout d'un membre champs "visible" : entier qui indique si le pixel est allumé ou éteint l'ajout de 3 méthodes membres "allumer", "éteindre" et "déplacer" la substitution (redéfinition) de la méthode "écrire". 23 class pixel : public point { int visible; /* 0 pour faux et 1 pour vrai */ pixel(void); void ecrire(int, int) ; void allumer (void ) ; void eteindre ( void); void deplacer (int, int); ; void pixel :: allumer (void ) { int couleur; couleur = getcolor(); putpixel ( lirex( ), lirey( ), couleur); visible = 1; 24 4

void pixel :: eteindre ( void) { int couleur; couleur = getbkcolor(); /* méthode qui récupère la couleur du fond */ putpixel ( lirex( ), lirey( ), couleur ); visible = 0; Il est nécessaire de surcharger la méthode "ecrire" de "point" afin de réaliser une affectation correcte du "pixel" (notamment pour le nouveau champs "visible"). void pixel :: ecrire (int nx, int ny) { point::ecrire (nx, ny); visible = 0; 25 26 On travaille par défaut dans la méthode pixel::ecrire sur une objet de la classe pixel, les méthodes de la classe ancêtre "point" peuvent donc être utilisées pour un pixel. appel de la méthode point::ecrire pour affecter les coordonnées X et Y du pixel. affectation du champs "visible" déclaré dans la sousclasse "pixel" void pixel :: deplacer ( int nx, int ny ) { if ( visible = = 1 ) eteindre ( ); ecrire ( nx, ny ); // de pixel allumer ( ); La méthode «deplacer» éteint le pixel s il était visible, change ses coordonnées par la méthode «ecrire» de pixel et «allume» de nouveau le pixel à sa nouvelle position. 27 28 On souhaite maintenant définir une classe dérivée de "pixel" appelée "cercle". Les coordonnées X et Y sont le centre du cercle, l'attribut visible s'applique à la visibilité du cercle, un nouvel attribut est spécifié pour décrire le rayon. Les méthodes «allumer», «éteindre» de la classe ancêtre sont surchargées et «ecrire» est redéfinie (pas le même nombre de paramètres). class cercle : public pixel { int rayon; void ecrire (int vx, int vy, int vr); void allumer(); void eteindre(); ; void cercle :: ecrire (int vx, int vy, int vr) { pixel::ecrire(vx,vy) rayon = vr; 29 30 5

void cercle :: allumer() { circle(lirex(), lirey(), rayon); visible =1; /* accès aux champs "visible" du cercle défini comme privé dans la sous-classe pixel, donc a priori inaccessible dans cercle */ Modification des droits d'accès sur "visible" nécessaire, Déclaration en mode "protégé" void cercle :: eteindre (void) { int couleur; couleur = getcolor(); setcolor(getbkcolor) circle(lirex(), lirey(), rayon); setcolor(couleur); visible = 0; 31 32 On souhaite récupérer la méthode "déplacer" définie sur les pixels qui consiste à effacer l'objet de sa position d'origine et à le réafficher à une position destination. Cette méthode "déplacer" fait appel aux méthodes "eteindre" et "allumer" dont il existe deux versions homonymes sur les pixels et sur les cercles Nécessité de s'assurer que ce sont bien les méthodes "eteindre" et "allumer" de la classe cercle qui seront utilisées. Le compilateur n'est pas en mesure de faire le choix car lors de la compilation, on ne sait pas encore de façon précise lequel des descendants va demander l'exécution de la méthode «déplacer». Nécessité de différer le choix de l'homonyme à appeler et prévoir tous les cas possibles. On appelle ligature dynamique cette méthode de résolution d'appels. 33 34 Le choix qui a été fait en C++ est de demander à l'utilisateur de signaler par le mot clé virtual toute méthode pour laquelle la ligature doit être dynamique. On parle de méthodes virtuelles. Un certain nombre de règles s'appliquent aux méthodes virtuelles en C++. Le mécanisme de ligature dynamique ne s'applique que pour des méthodes homonymes avec même en-tête. Il n'est pas possible de redéfinir une méthode virtuelle en ne modifiant de son en-tête que le type résultat. Une méthode virtuelle est obligatoirement membre de la classe, elle ne peut pas être globale. 35 36 6

Une méthode virtuelle qui est redéfinie sans modification d'en-tête dans une classe héritière reste obligatoirement virtuelle. Le mot clé virtual peut ou non apparaître de façon explicite, mais s'il apparaît il est redondant. class pixel : public point /* deuxième version */ { protected : int visible; public: void ecrire( int vx, int vy ) ; virtual void allumer ( ) ; virtual void eteindre ( ); void deplacer (int nx, int ny); ; 37 38 class cercle : public pixel { int rayon; void ecrire( int vx, int vy, int vr ) ; virtual void allumer ( ) ; virtual void eteindre ( ); ; On pourra alors de façon transparente, utiliser «deplacer» sur un «pixel» ou sur un «cercle». Lors des appels, le compilateur va détecter le type d objet réalisant l appel et aller sélectionner la méthode adéquate Classes abstraites Idée intuitive : Définir des concepts abstraits pour lesquels on ne peut pas directement définir des objets mais qui peuvent être préciser dans les classes héritières. définir une interface "générale" pour le concept dont l'implémentation est laissée à la charge des descendants méthode abstraite = méthode virtuelle "pure" 39 40 Classes abstraites Déclaration d une méthode virtuelle pure : virtual type nom (liste de paramètres) = 0; Si une classe contient une méthode abstraite, aucun objet de cette classe ne peut être manipulé. Nécessité d'employer le mécanisme d'héritage et de spécialisation du descendant pour définir le corps de la méthode Classes abstraites class gestion_fichier { /* possibilité de définir des champs ou vide */ virtual void ouvrir(char * nom_fich,int& num)=0; virtual void fermer(char *nom_fich)=0;... ; La déclaration d'un objet "gf" de type gestion_fichier est incorrecte gestion_fichier gf; // incorrect 41 42 7

Classes abstraites Description d une classe héritière qui implémente la méthode abstraite ouvrir class gestionnaire1 : public gestion_fichier {... void ouvrir(char *nom_fich, int& num); ; void ouvrir(char *nom_fich, int& num); { corps de la méthode Mais la classe gestionnaire1 contient encore une méthode abstraite ( fermer ). gestionnaire1 g; //déclaration incorrecte Classes abstraites class gestionnaire : public gestionnaire1 {... void fermer(char * nom_fich); ; void gestionnaire :: fermer(char * nom_fich) {... gestionnaire g; // déclaration correcte Toutes les méthodes abstraites ont été surchargées. 43 44 8