"Avant" la P.O.O. • Programmation modulaire
Introduction à la
– appels de sous-programmes, – exécution linéaire
Programmation Orientée Objet
• Programmation structurée – décomposition fonctionnelle – approche descendante
Programme PFIEV Danang, 2001
• Structuration des données – variables locales / globales Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
1
– d'une entité du monde "réel" – ou d'un concept
– Faciliter l'analyse
• Obtenir des logiciels
• Caractérisé par
mieux structurés (comportements et données) robustes de grande taille évolutifs modulaires réutilisables séminaire PFIEV, Da Nang,
Juin 2001
– des attributs (définissant son état) • les données
– des méthodes (ses comportements) • les traitements appliqués aux données • les actions que peut effectuer l'objet • les messages que l'on peut lui transmettre 3
Introduction à la POO - Philippe Marin
Couleur = jaune Poids = 8 kg Nombre de pignons = 5 Pignon actuel = 3e Cadence de pédalage = 30 Tr/min Vitesse actuelle : 27 km/h
– types d'attributs, méthodes
• méthodes : Changer de pignon (+1 ou -1) Afficher vitesse actuelle Tourner (droite ou gauche) Augmenter cadence (nouvelle cadence) Freiner Calculer vitesse
Introduction à la POO - Philippe Marin
4
• Les objets peuvent être "classés" par catégories, par ensembles d'objets de même nature. • Les objets d'une même classe partagent des caractéristiques communes
• attributs :
– – – – – –
séminaire PFIEV, Da Nang, Juin 2001
Notion de Classe
Exemple d'objet : ma bicyclette – – – – – –
2
• Représentant
• Mieux représenter le monde "réel".
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
Un objet, c'est quoi ?
Objectifs de la P.O.O.
– – – – – –
Introduction à la POO - Philippe Marin
Remarque : pas de méthode pour augmenter directement la vitesse. Elle est fonction de la cadence et du pignon actuel. La méthode Afficher vitesse appelle Calculer vitesse avant d'afficher le résultat.
séminaire PFIEV, Da Nang,
Juin 2001
• L'état d'un objet lui est propre – valeurs des attributs
• Instanciation : – création d'un objet d'une classe donnée 5
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
6
1
Exemple de Classe : Bicyclette
La notation "UML"
• attributs : – – – – – –
• Unified Modeling Language – Un langage graphique pour modéliser les applications. – Objets, Classes, – Leur organisation, leurs utilisations... Commentaire – Relations entre ces éléments...
Couleur : couleur Poids (kg) : réel Nombre de pignons : entier Pignon actuel : entier Cadence de pédalage (tours/min) : entier Vitesse actuelle (km/h) : réel
NomDeClasse Attributs
Changer de pignon (+1 ou -1) Afficher vitesse actuelle Tourner (angle) Augmenter cadence (incrément) Freiner (intensité)
ChangerPignon(Increment : Integer) AfficherVitesseActuelle() : Double Tourner(Angle : Double) AugmenterCadence(Increment : Integer) Freiner(Intensite : Integer)
Méthodes() Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
7
Juin 2001
Notion d'Instanciation
Introduction à la POO - Philippe Marin
•
Couleur : couleur Poids (kg) : réel Nombre de pignons : entier Pignon actuel : entier Cadence de pédalage (tours/min) : entier Vitesse actuelle (km/h) : réel
laBicycletteDeMonFrere •
Changer de pignon (+1 ou -1) Afficher vitesse actuelle Tourner (angle) Augmenter cadence (incrément) Freiner (intensité) Calculer vitesse
•
Introduction à la POO - Philippe Marin
méthodes : (de la classe)
attributs : – – – – – –
9
Juin 2001
Couleur = rouge Poids = 11 kg Nombre de pignons = 5 Pignon actuel = 2e Cadence de pédalage = 25 Tr/min Vitesse actuelle = 23 km/h
maBicyclette •
•
séminaire PFIEV, Da Nang,
attributs : – – – – – –
font partie de la classe Bicyclette. Introduction à la POO - Philippe Marin
8
Instanciation
méthodes : – – – – – –
– maBicyclette – laBicycletteDeMonFrere
méthodes
attributs : – – – – – –
• A partir de la définition d'une classe, on peut créer des "instances" : objets appartenant à cette classe. • Exemple :
attributs
séminaire PFIEV, Da Nang, Juin 2001
Bicyclette •
nom de la class e
Bicyclette couleur : couleur Poids : Double NombreDePignons : Integer PignonActuel : Integer CadencePedalage : Integer VitesseActuelle : Double
• méthodes : – – – – –
Représentation UML :
Couleur = jaune Poids = 10 kg Nombre de pignons = 5 Pignon actuel = 3e Cadence de pédalage = 30 Tr/min Vitesse actuelle = 27 km/h
méthodes : (de la classe)
séminaire PFIEV, Da Nang, Juin 2001
10
Autre exemple : la classe point • Attributs (décrivant l'état de l'objet) :
Petite pause...
– 2 coordonnées cartésiennes
• Méthodes : – distance à l'origine : renvoie une information – déplacement : modifie l'état de l'objet Type de l'attribut
Valeur initiale
point X : Double = 0 Y : Double = 0
Valeur retour
distanceOrig() : Double translate(dX : Double, dY : Double)
Arguments Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
11
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
12
2
La classe point, en java
Instanciation et références
en J
av a
point
class Point {
X : Double = 0 Y : Double = 0
double x = 0; // abscisse du point double y = 0; // ordonnée du point
• Pour désigner les objets, on utilise des variables de type particulier, les références.
distanceOrig() : Double translate(dX : Double, dY : Double)
• Une référence contient l'adresse de l'objet (en fait un pointeur vers la
// calcule et retourne la distance du point à l'origine double distanceOrig() { double dist; dist = Math.sqrt(x * x + y * y); return dist; }
structure de données contenant les attributs de l'objet).
• Une référence n'est pas un objet (elle est uniquement un nom pour désigner un objet) . • En Java, les objets doivent être alloués (créés) dynamiquement (grâce à l'opérateur new).
// translate le point de dx en abscisse et dy en ordonnée void translate(double dx, double dy) { x = x + dx; y = y + dy; }
• lorsque dans un programme Java, un objet n'est plus référencé, la mémoire qui lui était allouée est automatiquement libérée
} Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
13
Juin 2001
en J
Exemple
av a
création de 2 objets Point, et accès à ces points par des références Point p1; // référence vers un objet de type Point Point p2; // une autre référence Point p3; // et une troisième définition de référence
14
séminaire PFIEV, Da Nang, Juin 2001
Visibilité, principe d'encapsulation • Chaque fois que possible, un objet est "automome" – seules ses méthodes peuvent modifier son état (valeurs de ses attributs)
A ce stade du programme aucun objet n'a été créé
• La structure "idéale" d'un objet est alors la suivante : création d'objets (instanciation)
– les attributs lui sont "privés", non directement accessibles par des objets d'une autre classe (="Abstraction des données") – certaines méthodes privées peuvent effectuer des traitements internes sur les attributs (calculs…) – les méthodes "publiques" lui permettent de 'dialoguer' avec d'autres objets. – Le contenu des méthodes (privées ou publiques) n'est pas connu hors de l'objet (="Abstraction procédurale")
p1 = new Point(); // création d'un objet de classe Point désigné par la référence p1 p2 = new Point(); // création d'un autre objet Point désigné par la référence p2 affectation de référence p3 = p1; // p3 est un deuxième nom pour désigner l'objet déjà référencé par p1
Introduction à la POO - Philippe Marin
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
15
Introduction à la POO - Philippe Marin
Encapsulation "standard"
Principe d'encapsulation
public class Point { private double x; private double y;
• Structure schématique standard d'un objet :
en J
av a
Invisibles hors de cette classe // abscisse du point // ordonnée du point
// calcule et retourne la distance du point à l'origine public double distanceOrig() { double dist; Visible dist = Math.sqrt(x * x + y * y); return dist; }
Attributs
16
séminaire PFIEV, Da Nang, Juin 2001
des autres classes
// translate le point de dx en abscisse et dy en ordonnée public void translate(double dx, double dy) { x = x + dx; y = y + dy; }
Méthodes privées Méthodes publiques } Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
17
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
18
3
Intérêts de l'encapsulation
• Lorsque les attributs sont définis "privés", il est possible d'accéder à leurs valeurs si l'on a prévu des méthodes publiques pour cela :
• Inutile de savoir "comment fonctionne" l'objet pour l'utiliser – ayant un objet Point, on peut lui demander sa distance à l'origine, IL sait comment la calculer !
• Respect de l'intégrité de l'objet :
• On pourra modifier les valeurs des attributs d'un objet si le programmeur l'a autorisé par des méthodes publiques :
– obligation de passer par les méthodes "qui savent faire" (exemple : changement de pignon sur la bicyclette)
• Programmation : changement de représentation interne ou d'algorithme sans nécessité d'informer les utilisateurs de l'objet – (exemple : remplacement d'un tableau fini par une liste chaînée illimitée…)
Juin 2001
19
Introduction à la POO - Philippe Marin
– auxquels est capable de répondre... – ou qu'est capable de générer... ...un objet, définit son interface.
• L'interface d'un objet est donc constituée de la liste de :
(sans savoir comment !)
• Chaque objet doit donc "afficher"
– – – –
– son existance, – les "mots" qu'il connaît, – les actions qu'il sait effectuer. 21
ses méthodes publiques leurs paramètres (entrée / sortie) leur sémantique éventuellement ses attributs publics
Introduction à la POO - Philippe Marin
Interface...
• La transmission, chaîne et pignons, (méthode CalculerVitesse) est une méthode privée : l'utilisateur n'y accède pas directement. Juin 2001
in t)
Nom = N'Guyen Prénom = Dong Age = 42 ...
.
Fr
in t)
La bicyclette de N'Guyen (instance de la classe Bicyclette)
. ..
en ce (
ire V
ig no n(
NombrePignons=5 PignonActuel=43 Cadence=47 VitesseActuelle= 32 26 Au gm C...alcule rVit Ca esse () d
Co nd u
ei ne r(i nt
)
Ch an ge rP
élo ()
Envoi d'un message d'un objet à un autre Comportement interne de l'objet recevant le message ChangerPignon(+1)
son guidon : méthode Tourner (angle) son levier de vitesse : méthode ChangerPignon (+1 ou -1) ses poignées de freins : méthode Freiner(intensité) son compteur de vitesse : méthode AfficherVitesse() ses pédales : méthode AugmenterCadence(…)
séminaire PFIEV, Da Nang,
22
séminaire PFIEV, Da Nang, Juin 2001
Communication : exemple
• On parle aussi de "poignées" ("handles"), moyens de manipuler un objet. • Les poignées d'un vélo, ou son interface, seront :
Introduction à la POO - Philippe Marin
20
séminaire PFIEV, Da Nang, Juin 2001
(ne pas confondre avec une Classe interface)
• Un objet émetteur peut créer un message si il connaît ce que l'objet Récepteur peut faire
– – – – –
p2.setY(22);
• La liste des messages
(événements, requêtes, réponses,…)
Juin 2001
public void setX(double xx) { x = xx; } public void setY(double yy) { y = yy; }
L'interface d'un objet
• Les communications entre objets se font par l'intermédiaire de messages
séminaire PFIEV, Da Nang,
} public double getY() { return y; }
System.out.println("p2 : x = " + p2.getX() + "y = " + p2.getY());
Communications entre objets
Introduction à la POO - Philippe Marin
av a
public double getX() { return x;
..
séminaire PFIEV, Da Nang,
• Utilisation : p2.setX(14);
• Modularité, réutilisabilité, facilité de maintenance Introduction à la POO - Philippe Marin
en J
Accès aux attributs d'un objet
N'Guyen (instance de la classe Homme)
23
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
24
4
Envoi de messages à un objet
Envoi de messages à un objet
en J
av a
• un message est composé de trois parties • la référence permettant de désigner l'objet à qui le message est envoyé • le nom de la méthode à exécuter (cette méthode doit bien entendu être définie dans la classe de l'objet cible)
• la syntaxe en JAVA est : nomDeObjet.nomDeMethode(liste de paramètres) (si la méthode ne possède pas de paramètres, la liste est vide mais comme en langage C les parenthèses demeurent)
• les éventuels paramètres de la méthode
• un message est similaire à un appel de fonction • lorsqu'un message est envoyé les instructions définies dans la méthode sont exécutées puis le contrôle est retourné au programme appelant
• l'objet qui reçoit le message est implicitement passé comme argument à la méthode invoquée • le mot clé this est une référence qui permet de désigner cet argument implicite
• dans un message l'accent est mis sur l'objet (et non pas sur l'appel de fonction)
• this peut être utilisé pour rendre explicite l'accès aux propres variables et méthodes définies dans la classe
• en C on aurait probablement écrit : d1=distanceOrig(p1); • en POO, on écrira plutôt : d1=p1.distanceOrig(); ou : p2=p1.translate(10,25); Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
25
Juin 2001
en J
this : exemple
Introduction à la POO - Philippe Marin
av a
26
séminaire PFIEV, Da Nang, Juin 2001
Interface de la classe Point
en J
av a
(Ce qu'il est important de connaître pour utiliser cette classe)
• Les méthodes de modification des coordonnées du point pourraient être réécrites : public void setX(double xx) { x = xx; } public void setY(double yy) { y = yy; }
public class Point { // calcule et retourne la distance du point à l'origine : public double distanceOrig() { } // translate le point de dx en abscisse et dy en ordonnée : public void translate(double dx, double dy) { }
public class Point {
// accès aux variables d'instance :
private double x; // abscisse du point private double y; // ordonnée du point
public double getX() {} public double getY() {}
public void setX(double x) { this.x = x; } public void setY(double y) { this.y = y; } Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
public void setX(double) {} public void setY(double) {} } 27
Juin 2001
Communications avec la classe Point
en J
av a
// création de 3 points, et des références associées Point p1 = new Point(); Point p2 = new Point(); Point p3 = new Point();
séminaire PFIEV, Da Nang, Juin 2001
28
Héritage (1) • une classe peut être définie comme une sous-classe d'une autre classe (sa super-classe)
// initialise le Point p1 avec les coordonnées 10, 10
• chaque sous-classe hérite des caractéristiques de sa super-classe :
p1.setX(10); p1.setY(10); // initialise le Point p2 avec les coordonnées 14, 22
p2.setX(14); p2.setY(22);
– état (déclarations de variables)
// affiche coordonnées de p2
– méthodes
System.out.println("p2 : x = " + p2.getX() + "y = " + p2.getY()); double d1; double d2;
Introduction à la POO - Philippe Marin
• L'héritage met en œuvre le principe de généralisation/spécialisation
// distance à l'origine du Point p1 // distance à l'origine du point p2
d1 = p1.distanceOrig(); // envoi à p1 du message "calcule ta distance à l'origine" d2 = p2.distanceOrig(); // envoi du même message à p2 p1.translate(8,6); Introduction à la POO - Philippe Marin
// demande au point p1 de se déplacer... séminaire PFIEV, Da Nang,
Juin 2001
29
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
30
5
Héritage : exemple 1
Héritage (2)
• Catégories de bicyclettes ayant des attributs ou des comportements spécifiques
• les sous-classes peuvent ajouter des variables et/ou des méthodes à celles qu'elles héritent de leur super-classe.
Bicyclette ChangerPignon()
• les sous-classes peuvent redéfinir (override) les méthodes dont elles héritent et fournir ainsi des comportements spécialisés pour celles-ci.
VTT TypeAmortisseur
VeloDeCourse RoueLenticulaire
ChangerPignon()
• On peut traduire toute relation d'héritage par la phrase :
manette de changement de vitesse à la poignée
– « La classe dérivée est une version spécialisée de sa classe de base » Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
Tandem 2eSelle 2ePedalier
VeloDeVille retroviseur bequille
Un tandem est une bicyclette 31
Introduction à la POO - Philippe Marin
Héritage : exemple 2
séminaire PFIEV, Da Nang, Juin 2001
32
Héritage : exemple 2
• Soit une entreprise de transport, souhaitant gérer son parc de véhicules hétérogènes :
• Si l'entreprise achète des avions...
– voitures, camions, hélicoptères, bateaux Véhicule
• elle peut effectuer les regroupements suivants...
démarrer() ralentir() accélérer() arrêter()
Véhicule démarrer() ralentir() accélérer() Véhicule arrêter()
VéhiculeRoulant
Bat eau Bateau
VéhiculeRoulant
Bat Bateau eau
Spécialisation Voiture
Introduction à la POO - Philippe Marin
VéhiculeAerien VéhiculeA erien
Hélicoptère
Généralisation
Voiture
classes abstraites
Camion
Avion
Hélicoptère
Camion
séminaire PFIEV, Da Nang,
Juin 2001
33
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
Classes abstraites
Classes concrètes
• Une classe abstraite ne définit pas le contenu de certaines de ses méthodes. • Les méthodes non implémentées sont appelées méthodes abstraites. • Étant incomplète, une classe abstraite ne peut pas être instanciée. • Exemple : un "Véhicule" est un concept abstrait d'objet capable de démarrer, accélérer, ralentir et s'arrêter, (mais on ne peut pas définir précisément de quelle manière).
• Il appartient aux classes filles de la classe abstraite de définir chacune leur propre implémentation des méthodes manquantes. • Ces classes filles, appelées classes concrètes, pourront être instanciées. • Exemple : on pourra créer des objets voitures, hélicoptères ou bateaux, à condition de définir de quelle manière on démarre une voiture, un hélicoptère ou un bateau, chacun à sa façon.
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
35
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
34
36
6
en J
Héritage
av a
moyen de t ransport
Agrégation
Vehic ule RayonAction VitesseMaxi
L'agrégation traduit la relation : « Est composé de ... » ou « Possède … » VehiculeAMoteur ou encore « a … ».
• La syntaxe de déclaration d'une classe fille utilise le mot "extends" • La classe Point, à 2 coordonnées, peut être enrichie d'un attribut de couleur (spécialisation en PointColoré)
VehiculeSansMoteur
public class PointColore extends Point { private double x; private double y; private Couleur coul;
// abscisse du point // ordonnée du point // couleur du point
Voiture
Avion
Bateau
Bicyclette
Barque
...
Exemples :
public Couleur getCoul() {} public void setCoul(c) {} ...
"cardinalités"
2
4
1 Moteur
} Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
37
Introduction à la POO - Philippe Marin
1..3
Roue Diamètre
Chassis
Coque
38
séminaire PFIEV, Da Nang, Juin 2001
Variables et méthodes de classe Exemple...
Variables et méthodes "de classe" • Variables de classe : •
• variables partagées par toutes les instances de la classe • un seul exemplaire de ces variables est créé lorsque le système rencontre pour la première fois la classe dans le programme
•
• Méthodes de classe : •
• méthodes qui opèrent uniquement sur les variables de classe
NombreDeBicyclettes est un attribut de classe Il est incrémenté par la méthode de classe CréerUneBicyclette(), et décrémenté par DétruireLaBicyclette() La méthode ListerLesBicyclettes() est aussi une méthode de classe.
Bicyclette •
– – – – –
•
séminaire PFIEV, Da Nang,
Juin 2001
39
Introduction à la POO - Philippe Marin
NombreDeBicyclettes : entier Couleur : couleur Poids (kg) : réel Nombre de pignons : entier Pignon actuel : entier
méthodes : – – – – – – – –
• En notation UML, les attributs et méthodes de classes sont soulignés.
Introduction à la POO - Philippe Marin
attributs :
CréeUneBicyclette DétruireLa Bicyclette ListerLes Bicyclettes Changer de pignon (+1 ou -1) Afficher vitesse actuelle Tourner (angle) Augmenter cadence (incrément) Freiner (intensité)
40
séminaire PFIEV, Da Nang, Juin 2001
en J
Création d'un objet
Constructeur
av a
• La création d'un objet nécessite 2 étapes :
• Le constructeur est une méthode portant le nom de la classe, avec ou sans arguments. • Il est appelé lors de la création de chaque instance (new...). • Si aucun constructeur n'est défini, un constructeur par défaut sans arguments et qui n'effectue aucune initialisation particulière est invoqué.
– allouer de la mémoire et créer la structure permettant de stocker les informations, – initialiser les attributs spécifiques à l'objet créé. – La première étape est du ressort de la classe. – La deuxième étape est du ressort de l'objet.
• Dans certains langages (C++, java) les 2 étapes de création d'un objet sont regroupées dans une seule méthode appelée "constructeur" – le constructeur est à la fois méthode de classe et méthode d'instance. Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
41
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
42
7
Constructeur : exemple
en J
av a
public class Point { private double x; private double y;
Polymorphisme • C'est la possibilité pour une méthode, de prendre plusieurs formes
// abscisse du point // ordonnée du point
– selon la classe à laquelle elle appartient (dans une hiérarchie d'héritage) : redéfinition – ou selon sa "signature" (nombre et types de paramètres différents) : surcharge
// constructeur à 2 arguments réels public Point(double xx, double yy) { x = xx; y = yy; } }
p1 = new Point(12,25);
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
43
Juin 2001
Surcharge de constructeurs
en J
public class Point { private double x; private double y;
av a
// constructeur à 2 arguments réels public Point(double x, double y) { this.x = x; this.y = y;
• Outre la création et la destruction d'objets, nous souhaitons définir les méthodes : ObjetGraphique
// construit un point au même endroit que p
– – – –
Rappel : this est une référence qui permet de désigner l'objet contenant
this.y = p.y;
Redéfinition : exemple... – un point de base, – une couleur.
}
} // construit un point à l'origine public Point() { this.x = 0.0;
accès lecture et écriture aux attributs, affichage de l'objet, effacement de l'objet, déplacement de l'objet. Concept général: classe abstraite
this.y = 0.0; } } à la POO - Philippe Marin Introduction
séminaire PFIEV, Da Nang,
45
Juin 2001
Introduction à la POO - Philippe Marin
Redéfinition (suite) • Ajoutons 2 classes dérivées (concepts spécialisés) - hérite de l'ensemble des propriétés de la classe mère, - définit ses attributs propres, - et redéfinit les méthodes nécessitant des comportements spécifiques. Ligne
Cercle Rayon : Réel
Créer() Détruire() getLongueur() : Réel setLongueur(long : Réel) Afficher() Effacer()
Créer() Détruire() getRayon() : Réel setRayon(Ray : Réel) Afficher() Effacer()
Juin 2001
Créer() Détruire() getPointBase() setPointBase() DeplacerVers() Afficher() Effacer()
46
séminaire PFIEV, Da Nang, Juin 2001
• La méthode DéplacerVers() n'est pas redéfinie. Elle pourrait être implémentée (en java) :
Créer() Détruire() getPointBase() : point setPointBase(ptBase : point) DeplacerVers(ptCible : point) Afficher() Effacer()
Longueur : Réel Angle : Réel
séminaire PFIEV, Da Nang,
NombreObjetsGraphiques : Entier Coul : Couleur PointDeBase : point
Redéfinition (suite)
ObjetGraphique NombreObjetsGraphiques : Entier Coul : Couleur PointDeBase : point
Chacune des sous-classes
Introduction à la POO - Philippe Marin
44
séminaire PFIEV, Da Nang, Juin 2001
• Soit une classe d'objets graphiques, chacun représenté par :
// abscisse du point // ordonnée du point
public Point(Point p) { this.x = p.x;
Introduction à la POO - Philippe Marin
public void DeplacerVers (point ptCible) { Effacer(); setPointBase(ptCible); Afficher(); }
• DeplacerVers() de ObjetGraphique appelle setPointBase() de la classe mère, mais appelle Effacer() de Ligne ou de Cercle, automatiquement selon le type de l'objet courant. 47
Introduction à la POO - Philippe Marin
ObjetGraphique NombreObjetsGraphiques : Entier Coul : Couleur PointDeBase : point Créer() Détruire() getPointBase() : point setPointBase(ptBase : point) DeplacerVers(ptCible : point) Afficher() Effacer()
Ligne Longueur : Réel Angle : Réel
Cercle Rayon : Réel
Créer() Détruire() getLongueur() : Réel setLongueur(long : Réel) Afficher() Effacer()
Créer() Détruire() getRayon() : Réel setRayon(Ray : Réel) Afficher() Effacer()
séminaire PFIEV, Da Nang, Juin 2001
48
8
Commentaires sur les mécanismes de l'héritage
Exercice : classes "graphiques"
• Code de taille plus faible : on factorise au niveau des classes généralisées les comportements communs à toute une hiérarchie, • Pour les classes dérivées, seul le code spécifique reste à écrire : développement plus rapide et plus fiable, • Modélisation d'une notion très naturelle permettant de créer des systèmes conceptuellement bien conçus, • Le code des classes les plus élevées dans la hiérarchie (les plus générales) est utilisé très souvent et gagne rapidement en fiabilité car il est très souvent sollicité et donc débogué rapidement, • Si la hiérarchie est bien pensée, il est aisé de rajouter de nouvelles classes en considérant les différences de la nouvelle classe par rapport à celles déjà présentes dans la hiérarchie : on parle de programmation différentielle. Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
49
Juin 2001
Shape2D
Shape3D
perimeter() : Réel
volume() : Réel
perimeter() créer(name, width, heigth) area()
perimeter() créer(r1, r2) area()
Square
Circle
créer(side)
Introduction à la POO - Philippe Marin
area() créer(name : String)
Ellipse r1 : Réel r2 : Réel
Sphere r : Réel volume() créer(r) area()
Cylinder r : Réel h : Réel volume() créer(r, h) area()
créer(r)
séminaire PFIEV, Da Nang,
51
Juin 2001
Exercice : la classe "principale" de l'application import Rectangle; import Square; import Circle; // ...
en J
av a
Importation des déclarations d'interfaces de toutes les classes référencées, nécessaire si elles ne sont pas dans le même répertoire… (ou package)
public class ShapeTest { public static void main(String[] args) { System.out.println("Je cree un tableau de Shape"); Création du tableau de Shape shapes[] = { new Rectangle("mon rectangle", 10.0, 20.0), références new Square("mon carre", 5.0), new Ellipse("mon ellipse", 4.0, 3.0), new Circle("mon cercle", 2.0), Appel de la méthode de new Sphere("ma sphere", 15.0), calcul selon le type précis new Cylinder("mon cylindre", 3.0, 5.0) chaque classe du tableau }; (grâce au mécanisme de // On affiche les figures contenues dans le tableau polymorphisme) for(int i=0; i < shapes.length; i++) { System.out.print("objet " + shapes[i].name + " : aire=" + shapes[i].area() ); if (shapes[i] instanceof Shape2D) System.out.println(" perimetre=" + ( (Shape2D)shapes[i]).perimeter() ); else if (shapes[i] instanceof Shape3D) System.out.println(" volume=" + ( (Shape3D)shapes[i]).volume() ); } System.out.println("J'ai fini mon boulot"); } } Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
Écrire en outre une classe "ShapeTest" permettant de créer un tableau de Shape et d'imprimer ensuite leurs caractéristiques. Introduction à la POO - Philippe Marin
50
séminaire PFIEV, Da Nang, Juin 2001
en J
av a
*/ /** public class Rectangle extends Shape2D { * Classe abstraite mere de toutes les figures double width = 0.0; */ double height = 0.0; /** public abstract class Shape { * Classe abstraite mere de toutes les figures 2D public String name; /** Crée un rectangle */ * @param name le nom du rectangle public abstract class Shape2D extends Shape { public Shape(String name) { * @param width la largeur du rectangle this.name = name; * @param height la hauteur du rectangle public Shape2D(String name) { } */ super(name); public Rectangle(String name, double width, double height) { } /** super(name); * Calcul l'aire de la figure this.width = width; /** * @return l'aire de la figure this.height = height; * Calcul le perimetre de la figure */ } public abstract double area(); * @return le perimetre de la figure } */ /** Calcule l'aire du rectangle public abstract double perimeter(); * @return l'aire du rectangle } */ public double area() { /** Cette classe gere des carrés return width * height; */ } public class Square extends Rectangle {
Shape name : String
Rectangle height : Réel width : Réel
Architecture des classes :Ecrivez les classes reflétant la structure suivante : •Shape (*) •Shape2D (*) •Rectangle Ces classes doivent permettre de : •Square - identifier les objets lors de leur création (ex. : •Ellipse Circle c = new Circle("mon cercle", 2.5)) •Circle - calculer la surface des objets (méthode area()) •Shape3D (*) •Sphere - calculer le périmètre des objets dérivant de Shape2D •Cylinder (méthode perimeter()) (*) classe abstraite (non instanciable) - calculer le volume des objets dérivant de Shape3D (méthode volume())
Exercice : traduction du modèle conceptuel en langage /** Cette classe gere des rectangles
Exercice : modèle conceptuel Noter la présence des méthodes abstraites (on ne peut pas les implémenter à ce niveau, mais on veut obliger les classes filles à définir ces méthodes)
On souhaite disposer d'un ensemble de classes permettant de manipuler des objets géométriques en 2 et 3 dimensions. (on ne s'occupe pas de leur représentation graphique)
de
53
/** Calcule le perimetre du rectangle /** Crée un carre * @return le perimetre du rectangle * @param name le nom du carre */ * @param side la longueur du coté du carré public double perimeter() { */ return 2 * (width + height); public Square(String name, double side) { } super(name, side, side); } } } Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
52
Regroupement des classes : les Paquetages • La notion de paquetage (ou package) permet de regrouper des classes faisant partie d'une même structure logique ou thématique • Une organisation hiérarchique des paquetages est possible • Permet de référencer globalement toutes les classes d'un même paquetage • Évite une éventuelle confusion entre 2 classes de même nom appartenant à des paquetages différents Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
54
9
en J
Paquetages
av a
Exercice : suite...
• Le nom d'une classe dans un paquetage standard est généralement construit :
en J
av a
– Déploiement dans des packages
•
NomDeFournisseur.NomDeCatégorie.NomDeClasse exemple : java.awt.Graphics
Déployez ces classes dans les packages : – shape • shape.shape2D
• Possibilité de définir ses propres paquetages • L'appartenance d'une classe à un paquetage est définie en début de fichier, exemple :
• shape.shape3D
– Comptabilisation des instances
package shape.shape3D
• Nécessité pour la machine virtuelle d'organiser les fichiers de classes dans une arborescence de répertoires similaire à la hiérarchie des paquetages. • Importation globale des déclarations d'interfaces de toutes les classes d'un paquetage, exemple :
•
Ajoutez des variables de classes (count) comptabilisant le nombre d'instances des classes Shape, Shape2D et Shape3D (prévoir le cas de suppression d'instances).
•
Insérez des commentaires conformes aux spécifications de l'utilitaire javadoc et générez la documentation HTML des packages avec cet outil.
– Génération de la documentation
import shape.shape2D.* Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
en J
Exercice : ...
package shape; public abstract class Shape { public static int count = 0; public String name; public Shape(String name) { count++; this.name = name; }
55
Juin 2001
56
séminaire PFIEV, Da Nang, Juin 2001
Exercice...
av a
package shape.shape2D;
en J
av a
import shape.*; import shape.shape2D.*; import shape.shape3D.*;
public abstract class Shape2D extends shape.Shape { public static int count = 0; // différent de Shape.count !
public class ShapeTest { public static void main(String[] args) {
public Shape2D(String name) { super(name); count++; }
protected void finalize() throws Throwable { System.out.println("Shape.finalize"); count--; super.finalize(); } ... package shape.shape2D;
Shape shapes[] = { new Rectangle("mon rectangle", 10.0, 20.0), new Square("mon carre", 5.0), new Ellipse("mon ellipse", 4.0, 3.0), // ...
protected void finalize() throws Throwable { System.out.println("Shape2D.finalize"); count--; super.finalize(); } ...
public class Rectangle extends Shape2D { double width = 0.0; double height = 0.0;
// On affiche le nombre d'instances dans chacunes des classes System.out.println("Nombre de shapes : " + Shape.count); System.out.println("Nombre de shapes 2D :" + Shape2D.count); System.out.println("Nombre de shapes 3D :" + Shape3D.count);
public Rectangle(String name, double width, double height) { super(name); this.width = width; this.height = height; } ... Introduction à la POO - Philippe Marin
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
} } 57
Juin 2001
Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang, Juin 2001
58
Quelques Notions Complémentaires qui n'ont pas pu être abordées dans cette introduction...
• Associations entre objets • Classe "interface" (en l'absence d'héritage multiple) • Autres niveaux de visibilité (protected, friend…) en J
av a
Tout l'apprentissage du langage Java et de ses librairies (API) nombreuses et variées… mais ce n'était pas l'objectif de cette Introduction à la Programmation Orientée Objet ! Introduction à la POO - Philippe Marin
séminaire PFIEV, Da Nang,
Juin 2001
59
10