Vous êtes sur la page 1sur 10

"Avant" la P.O.O.

• Programmation modulaire
Introduction à la – appels de sous-programmes,
– exécution linéaire
Programmation Orientée Objet
• Programmation structurée
Programme PFIEV – décomposition fonctionnelle
Danang, 2001 – approche descendante
• Structuration des données
– variables locales / globales

1 2
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Objectifs de la P.O.O. Un objet, c'est quoi ?


• Représentant
• Mieux représenter le monde "réel".
– d'une entité du monde "réel"
– Faciliter l'analyse
– ou d'un concept
• Obtenir des logiciels
• Caractérisé par
– mieux structurés (comportements et données)
– des attributs (définissant son état)
– robustes • les données
– de grande taille – des méthodes (ses comportements)
– évolutifs • les traitements appliqués aux données
– modulaires • les actions que peut effectuer l'objet
– réutilisables • les messages que l'on peut lui transmettre

3 4
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Exemple d'objet : ma bicyclette Notion de Classe


• attributs : • Les objets peuvent être "classés" par
– Couleur = jaune catégories, par ensembles d'objets de même
– Poids = 8 kg
– Nombre de pignons = 5
nature.
– Pignon actuel = 3e • Les objets d'une même classe partagent des
– Cadence de pédalage = 30 Tr/min
caractéristiques communes
– Vitesse actuelle : 27 km/h
• méthodes : – types d'attributs, méthodes
Remarque : pas de méthode pour
– Changer de pignon (+1 ou -1)
augmenter directement la vitesse. • L'état d'un objet lui est propre
– Afficher vitesse actuelle Elle est fonction de la cadence
– Tourner (droite ou gauche) et du pignon actuel. – valeurs des attributs
La méthode Afficher vitesse
– Augmenter cadence (nouvelle cadence)
appelle Calculer vitesse avant • Instanciation :
– Freiner d'afficher le résultat.
– Calculer vitesse – création d'un objet d'une classe donnée
5 6
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

1
La notation "UML" Exemple de Classe : Bicyclette
• attributs :
– Couleur : couleur
• Unified Modeling Language – Poids (kg) : réel
– Un langage graphique pour modéliser les – Nombre de pignons : entier
applications. – Pignon actuel : entier Représentation UML :
– Cadence de pédalage (tours/min) : entier nom de la
– Objets, Classes, – Vitesse actuelle (km/h) : réel
class e

Bicyclette
– Leur organisation, leurs utilisations... • méthodes : couleur : couleur
Poids : Double
Commentaire – Changer de pignon (+1 ou -1)
– Relations entre ces éléments... NombreDePignons : Integer
PignonActuel : Integer
attributs
– Afficher vitesse actuelle CadencePedalage : Integer
VitesseActuelle : Double
NomDeClasse – Tourner (angle)
ChangerPignon(Increment : Integer)
Attributs – Augmenter cadence (incrément) AfficherVitesseActuelle() : Double
Tourner(Angle : Double)
– Freiner (intensité) AugmenterCadence(Increment : Integer) méthodes
Freiner(Intensite : Integer)
Méthodes()
7 8
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Notion d'Instanciation Bicyclette Instanciation


• attributs :
– Couleur : couleur
– Poids (kg) : réel laBicycletteDeMonFrere
– Nombre de pignons : entier
• A partir de la définition d'une classe, on – Pignon actuel : entier
• attributs :
– Couleur = rouge
– Cadence de pédalage (tours/min) : entier
– Poids = 11 kg
peut créer des "instances" : objets •
– Vitesse actuelle (km/h) : réel
méthodes :
– Nombre de pignons = 5
– Pignon actuel = 2e
appartenant à cette classe. –

Changer de pignon (+1 ou -1)
Afficher vitesse actuelle
– Cadence de pédalage = 25 Tr/min
– Vitesse actuelle = 23 km/h
– Tourner (angle)
• Exemple : – Augmenter cadence (incrément)
• méthodes : (de la classe)

– Freiner (intensité)
– maBicyclette – Calculer vitesse
maBicyclette
• attributs :
– laBicycletteDeMonFrere – Couleur = jaune
– Poids = 10 kg
– Nombre de pignons = 5
– Pignon actuel = 3e

font partie de la classe Bicyclette. –



Cadence de pédalage = 30 Tr/min
Vitesse actuelle = 27 km/h
• méthodes : (de la classe)

9 10
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

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 Valeur retour
Y : Double = 0

distanceOrig() : Double
translate(dX : Double, dY : Double)
Arguments
11 12
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

2
en
J av
La classe point, en java Instanciation et références a
point
class Point { X : Double = 0

double x = 0; // abscisse du point


Y : Double = 0 • Pour désigner les objets, on utilise des variables de type
double y = 0; // ordonnée du point distanceOrig() : Double particulier, les références.
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
structure de données contenant les attributs de l'objet).
double distanceOrig() {
double dist; • Une référence n'est pas un objet (elle est uniquement un nom pour
dist = Math.sqrt(x * x + y * y);
return dist; désigner un objet) .
}
• En Java, les objets doivent être alloués (créés) dynamiquement
// translate le point de dx en abscisse et dy en ordonnée (grâce à l'opérateur new).
void translate(double dx, double dy) {
x = x + dx; • lorsque dans un programme Java, un objet n'est plus référencé, la
y = y + dy; mémoire qui lui était allouée est automatiquement libérée
}
}

13 14
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
J av
Exemple a Visibilité, principe d'encapsulation
création de 2 objets Point,
et accès à ces points par des références • Chaque fois que possible, un objet est "automome"
Point p1; // référence vers un objet de type Point A ce stade du programme
– seules ses méthodes peuvent modifier son état (valeurs de ses
Point p2; // une autre référence aucun objet n'a été créé attributs)
Point p3; // et une troisième définition de référence
• 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
p1 = new Point(); // création d'un objet de classe Point désigné par la référence p1 par des objets d'une autre classe (="Abstraction des données")
p2 = new Point(); // création d'un autre objet Point désigné par la référence p2 – certaines méthodes privées peuvent effectuer des traitements
affectation de référence internes sur les attributs (calculs…)
p3 = p1; // p3 est un deuxième nom pour désigner l'objet déjà référencé par p1 – 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")
15 16
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
J
Encapsulation "standard" av
a
Principe d'encapsulation
public class Point { Invisibles hors de cette classe
private double x; // abscisse du point
private double y; // ordonnée du point
• Structure schématique standard d'un objet :
// calcule et retourne la distance du point à l'origine
public double distanceOrig() {
double dist;
dist = Math.sqrt(x * x + y * y); Visible des autres classes
return dist;
Attributs }
Méthodes // translate le point de dx en abscisse et dy en ordonnée
privées public void translate(double dx, double dy) {
x = x + dx;
Méthodes publiques y = y + dy;
}
}

17 18
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

3
en
J
Intérêts de l'encapsulation Accès aux attributs d'un objet av
a

• Inutile de savoir "comment fonctionne" l'objet pour • Lorsque les attributs sont définis public double getX() {
return x;
l'utiliser "privés", il est possible d'accéder
}
– ayant un objet Point, on peut lui demander sa distance à l'origine, IL sait à leurs valeurs si l'on a prévu des public double getY() {
comment la calculer ! méthodes publiques pour cela : return y;
}
• Respect de l'intégrité de l'objet :
– obligation de passer par les méthodes "qui savent faire"
• On pourra modifier les valeurs
public void setX(double xx) {
(exemple : changement de pignon sur la bicyclette) des attributs d'un objet si le x = xx;
• Programmation : changement de représentation interne programmeur l'a autorisé par }
des méthodes publiques : public void setY(double yy) {
ou d'algorithme sans nécessité d'informer les utilisateurs y = yy;
de l'objet }
– (exemple : remplacement d'un tableau fini par une liste chaînée illimitée…)
• Utilisation :
p2.setX(14); p2.setY(22);
• Modularité, réutilisabilité, facilité de maintenance
System.out.println("p2 : x = " + p2.getX() + "y = " + p2.getY());
19 20
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Communications entre objets L'interface d'un objet


(ne pas confondre avec une Classe interface)
• Les communications entre objets se font par • La liste des messages
l'intermédiaire de messages – auxquels est capable de répondre...
(événements, requêtes, réponses,…)
– ou qu'est capable de générer...
• Un objet émetteur peut créer un message si il ...un objet, définit son interface.
connaît ce que l'objet Récepteur peut faire
• L'interface d'un objet est donc constituée de
(sans savoir comment !)
la liste de :
• Chaque objet doit donc "afficher" – ses méthodes publiques
– son existance, – leurs paramètres (entrée / sortie)
– les "mots" qu'il connaît, – leur sémantique
– les actions qu'il sait effectuer. – éventuellement ses attributs publics
21 22
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Interface... Communication : exemple


• On parle aussi de "poignées" ("handles"), Envoi d'un message d'un objet à un autre
moyens de manipuler un objet. Comportement interne de l'objet recevant le message
ChangerPignon(+1)
• Les poignées d'un vélo, ou son interface, Ch
seront : an
()

ge
élo
)
nt

rP
V
r(i

ig
ire
ne

– son guidon : méthode Tourner (angle) no


u
ei

n(
nd

NombrePignons=5
Fr

in
Co

– son levier de vitesse : méthode ChangerPignon (+1 ou -1) PignonActuel=43 t) Nom = N'Guyen
Cadence=47 Prénom = Dong
Au VitesseActuelle= 3226 Age = 42
– ses poignées de freins : méthode Freiner(intensité) gm C...alcule ...
Ca rVit
esse
– son compteur de vitesse : méthode AfficherVitesse() d en
()
.

ce
..

– ses pédales : méthode AugmenterCadence(…) (


..

in
t)
• La transmission, chaîne et pignons, (méthode La bicyclette de N'Guyen
CalculerVitesse) est une méthode privée : l'utilisateur (instance de la classe Bicyclette) N'Guyen
(instance de la classe Homme)
n'y accède pas directement. 23 24
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

4
en
J av
Envoi de messages à un objet Envoi de messages à un objet a
• un message est composé de trois parties
• la référence permettant de désigner l'objet à qui le message est envoyé
• la syntaxe en JAVA est :
• le nom de la méthode à exécuter (cette méthode doit bien entendu être
nomDeObjet.nomDeMethode(liste de paramètres)
définie dans la classe de l'objet cible)
(si la méthode ne possède pas de paramètres, la liste est vide mais
• les éventuels paramètres de la méthode comme en langage C les parenthèses demeurent)
• un message est similaire à un appel de fonction • l'objet qui reçoit le message est implicitement
• lorsqu'un message est envoyé les instructions définies dans la méthode passé comme argument à la méthode invoquée
sont exécutées puis le contrôle est retourné au programme appelant
• le mot clé this est une référence qui permet de désigner cet
• dans un message l'accent est mis sur l'objet (et non pas sur l'appel argument implicite
de fonction) • this peut être utilisé pour rendre explicite l'accès aux propres
• en C on aurait probablement écrit : d1=distanceOrig(p1); variables et méthodes définies dans la classe
• en POO, on écrira plutôt : d1=p1.distanceOrig();
ou : p2=p1.translate(10,25);
25 26
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en en
J av J av
this : exemple a Interface de la classe Point a

(Ce qu'il est important de connaître pour utiliser cette classe)


• Les méthodes de modification des coordonnées
public class Point {
du point pourraient être réécrites :
// calcule et retourne la distance du point à l'origine :
public void setX(double xx) { public double distanceOrig() { }
x = xx;
}
// translate le point de dx en abscisse et dy en ordonnée :
public void setY(double yy) { public void translate(double dx, double dy) { }
y = yy; public class Point {
// accès aux variables d'instance :
}
private double x; // abscisse du point
public double getX() {}
private double y; // ordonnée du point
public double getY() {}
public void setX(double x) {
this.x = x; public void setX(double) {}
} public void setY(double) {}
public void setY(double y) {
this.y = y; }
}
27 28
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
J av
Communications avec la classe Point a Héritage (1)
// création de 3 points, et des références associées
Point p1 = new Point();
Point p2 = new Point(); • une classe peut être définie comme une sous-classe
Point p3 = new Point();
d'une autre classe (sa super-classe)
// initialise le Point p1 avec les coordonnées 10, 10
p1.setX(10); p1.setY(10); • chaque sous-classe hérite des caractéristiques de sa
// initialise le Point p2 avec les coordonnées 14, 22 super-classe :
p2.setX(14); p2.setY(22);
– état (déclarations de variables)
// affiche coordonnées de p2
System.out.println("p2 : x = " + p2.getX() + "y = " + p2.getY()); – méthodes
double d1; // distance à l'origine du Point p1 • L'héritage met en œuvre le principe de
double d2; // distance à l'origine du point p2
généralisation/spécialisation
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); // demande au point p1 de se déplacer...
29 30
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

5
Héritage (2) Héritage : exemple 1
• les sous-classes peuvent ajouter des variables • Catégories de bicyclettes ayant des attributs
et/ou des méthodes à celles qu'elles héritent de ou des comportements spécifiques
leur super-classe. Bicyclette

ChangerPignon()
• les sous-classes peuvent redéfinir (override) les
méthodes dont elles héritent et fournir ainsi des
VTT
comportements spécialisés pour celles-ci. TypeAmortisseur VeloDeCourse
RoueLenticulaire
ChangerPignon()
• On peut traduire toute relation d'héritage par la
manette de Tandem
phrase : changement de
VeloDeVille
retroviseur
2eSelle
2ePedalier
vitesse à la poignée
bequille
– « La classe dérivée est une version spécialisée de sa
classe de base »
Un tandem est une bicyclette
31 32
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Héritage : exemple 2 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() classes
ralentir() abstraites
Véhicule
accélérer()
arrêter()
démarrer()
ralentir()
accélérer()
Véhicule
arrêter()
VéhiculeRoulant Bat
Bateau
eau VéhiculeAerien
VéhiculeA erien

VéhiculeRoulant Bat eau


Bateau Hélicoptère
Spécialisation
Généralisation Avion Hélicoptère
Voiture Camion

Voiture Camion

33 34
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 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 • Il appartient aux classes filles de la classe abstraite
certaines de ses méthodes. de définir chacune leur propre implémentation des
• Les méthodes non implémentées sont appelées méthodes manquantes.
méthodes abstraites. • Ces classes filles, appelées classes concrètes,
• Étant incomplète, une classe abstraite ne peut pas pourront être instanciées.
être instanciée. • Exemple : on pourra créer des objets voitures,
• Exemple : un "Véhicule" est un concept abstrait hélicoptères ou bateaux, à condition de définir de
d'objet capable de démarrer, accélérer, ralentir et quelle manière on démarre une voiture, un
s'arrêter, (mais on ne peut pas définir précisément de hélicoptère ou un bateau, chacun à sa façon.
quelle manière).
35 36
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

6
en moyen de
J av
Héritage a Agrégation Vehic ule
RayonAction
t ransport

VitesseMaxi
L'agrégation traduit la relation :
• La syntaxe de déclaration d'une classe fille utilise le « Est composé de ... »
mot "extends" ou « Possède … »
VehiculeAMoteur VehiculeSansMoteur
ou encore « a … ».
• La classe Point, à 2 coordonnées, peut être enrichie
d'un attribut de couleur (spécialisation en PointColoré)
public class PointColore extends Point {
private double x; // abscisse du point Voiture Avion Bateau Bicyclette Barque
private double y; // ordonnée du point
private Couleur coul; // couleur du point
...
public Couleur getCoul() {} Exemples :
public void setCoul(c) {} 2 1..3
4
... 1
"cardinalités" Moteur Chassis Roue
Coque
} Diamètre

37 38
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Variables et méthodes "de classe" Variables et méthodes de classe


Exemple...
• Variables de classe :
• NombreDeBicyclettes est un attribut de
• variables partagées par toutes les instances de la classe classe
• un seul exemplaire de ces variables est créé lorsque le système • Il est incrémenté par la méthode de Bicyclette
rencontre pour la première fois la classe dans le programme classe CréerUneBicyclette(), et • attributs :

• Méthodes de classe : décrémenté par DétruireLaBicyclette() – NombreDeBicyclettes : entier


– Couleur : couleur
• La méthode ListerLesBicyclettes() est – Poids (kg) : réel
• méthodes qui opèrent uniquement sur les variables de classe aussi une méthode de classe. – Nombre de pignons : entier
– Pignon actuel : entier
• méthodes :
– CréeUneBicyclette
• En notation UML, les attributs et méthodes de classes sont – DétruireLa Bicyclette
– ListerLes Bicyclettes
soulignés. – Changer de pignon (+1 ou -1)
– Afficher vitesse actuelle
– Tourner (angle)
– Augmenter cadence (incrément)
– Freiner (intensité)

39 40
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
J av
Création d'un objet a
Constructeur
• La création d'un objet nécessite 2 étapes :
– allouer de la mémoire et créer la structure permettant de • Le constructeur est une méthode portant le
stocker les informations,
nom de la classe, avec ou sans arguments.
– initialiser les attributs spécifiques à l'objet créé.
• Il est appelé lors de la création de chaque
– La première étape est du ressort de la classe. instance (new...).
– La deuxième étape est du ressort de l'objet. • Si aucun constructeur n'est défini, un
• Dans certains langages (C++, java) les 2 étapes de constructeur par défaut sans arguments et
création d'un objet sont regroupées dans une seule qui n'effectue aucune initialisation
méthode appelée "constructeur"
particulière est invoqué.
– le constructeur est à la fois méthode de classe et méthode
d'instance.
41 42
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

7
en
J av
Constructeur : exemple a Polymorphisme

public class Point {


private double x; // abscisse du point
• C'est la possibilité pour une méthode, de
private double y; // ordonnée du point prendre plusieurs formes
// constructeur à 2 arguments réels
– selon la classe à laquelle elle appartient (dans
public Point(double xx, double yy) { une hiérarchie d'héritage) : redéfinition
x = xx;
y = yy; – ou selon sa "signature" (nombre et types de
} paramètres différents) : surcharge
}

p1 = new Point(12,25);

43 44
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
Surcharge de constructeurs J av
a Redéfinition : exemple...
public class Point {
private double x; // abscisse du point • Soit une classe d'objets graphiques, chacun
private double y; // ordonnée du point
représenté par :
// constructeur à 2 arguments réels
public Point(double x, double y) { – un point de base,
this.x = x; – une couleur.
this.y = y;
} • Outre la création et la destruction d'objets, nous
// construit un point au même endroit que p souhaitons définir les méthodes : ObjetGraphique
public Point(Point p) { NombreObjetsGraphiques : Entier
– accès lecture et écriture aux attributs, Coul : Couleur
this.x = p.x; Rappel :
this.y = p.y; this est une référence qui permet
– affichage de l'objet, PointDeBase : point

} de désigner l'objet contenant – effacement de l'objet, Créer()


// construit un point à l'origine Détruire()
– déplacement de l'objet. getPointBase()
public Point() {
setPointBase()
this.x = 0.0; DeplacerVers()
Concept général:
this.y = 0.0; classe abstraite
Afficher()
} Effacer()
} à la POO - Philippe Marin 45 46
Introduction séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

Redéfinition (suite) Redéfinition (suite)


• Ajoutons 2 classes ObjetGraphique
• La méthode DéplacerVers() n'est ObjetGraphique

dérivées (concepts spécialisés) NombreObjetsGraphiques : Entier


Coul : Couleur
pas redéfinie. Elle pourrait être NombreObjetsGraphiques : Entier
Coul : Couleur
PointDeBase : point implémentée (en java) : PointDeBase : point

Chacune des sous-classes Créer()


Détruire()
public void DeplacerVers (point ptCible) {
Créer()
Détruire()
getPointBase() : point getPointBase() : point
- hérite de l'ensemble des propriétés de la setPointBase(ptBase : point) Effacer(); setPointBase(ptBase : point)
DeplacerVers(ptCible : point) DeplacerVers(ptCible : point)
classe mère, Afficher()
setPointBase(ptCible); Afficher()
- définit ses attributs propres, Effacer() Afficher(); Effacer()
}
- et redéfinit les méthodes nécessitant des
comportements spécifiques. Ligne Ligne
Longueur : Réel
Cercle • DeplacerVers() de ObjetGraphique Longueur : Réel Cercle
Angle : Réel Rayon : Réel Angle : Réel Rayon : Réel
appelle setPointBase() de la classe
Créer() Créer() Créer() Créer()
Détruire() Détruire() mère, mais appelle Effacer() de Détruire() Détruire()
getLongueur() : Réel getRayon() : Réel getLongueur() : Réel getRayon() : Réel
setLongueur(long : Réel) setRayon(Ray : Réel) Ligne ou de Cercle, setLongueur(long : Réel) setRayon(Ray : Réel)
Afficher() Afficher() Afficher() Afficher()
Effacer() Effacer() automatiquement selon le type de Effacer() Effacer()

l'objet courant.
47 48
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

8
Commentaires sur les mécanismes Exercice : classes "graphiques"
de l'héritage On souhaite disposer d'un ensemble de classes permettant de
• Code de taille plus faible : on factorise au niveau des classes manipuler des objets géométriques en 2 et 3 dimensions.
généralisées les comportements communs à toute une hiérarchie, (on ne s'occupe pas de leur représentation graphique)
• Pour les classes dérivées, seul le code spécifique reste à écrire :
Architecture des classes :Ecrivez les classes reflétant la structure suivante :
développement plus rapide et plus fiable, •Shape (*)
• Modélisation d'une notion très naturelle permettant de créer des •Shape2D (*)
•Rectangle Ces classes doivent permettre de :
systèmes conceptuellement bien conçus, •Square
•Ellipse - identifier les objets lors de leur création (ex. :
• Le code des classes les plus élevées dans la hiérarchie (les plus Circle c = new Circle("mon cercle", 2.5))
•Circle
générales) est utilisé très souvent et gagne rapidement en fiabilité •Shape3D (*) - calculer la surface des objets (méthode area())
•Sphere - calculer le périmètre des objets dérivant de Shape2D
car il est très souvent sollicité et donc débogué rapidement, •Cylinder (méthode perimeter())
• Si la hiérarchie est bien pensée, il est aisé de rajouter de nouvelles (*) classe abstraite (non instanciable) - calculer le volume des objets dérivant de Shape3D
(méthode volume())
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 Écrire en outre une classe "ShapeTest" permettant de créer un tableau de Shape
programmation différentielle. et d'imprimer ensuite leurs caractéristiques.
49 50
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
Exercice : traduction du modèle J av
Exercice : modèle conceptuel conceptuel en langage /** Cette classe gere des rectangles
a
*/
Shape /**
* Classe abstraite mere de toutes les figures public class Rectangle extends Shape2D {
Noter la présence des méthodes name : String */ double width = 0.0;
abstraites (on ne peut pas les public abstract class Shape { /** double height = 0.0;
area() * Classe abstraite mere de toutes les figures 2D
implémenter à ce niveau, mais on créer(name : String) public String name; */ /** Crée un rectangle
veut obliger les classes filles à public abstract class Shape2D extends Shape { * @param name le nom du rectangle
public Shape(String name) { * @param width la largeur du rectangle
définir ces méthodes) this.name = name; public Shape2D(String name) { * @param height la hauteur du rectangle
Shape2D Shape3D } */
super(name);
/** } public Rectangle(String name, double width, double height) {
perimeter() : Réel volume() : Réel super(name);
* Calcul l'aire de la figure
* @return l'aire de la figure /** this.width = width;
*/ * Calcul le perimetre de la figure this.height = height;
public abstract double area(); * @return le perimetre de la figure }
} */
Rectangle Ellipse
public abstract double perimeter(); /** Calcule l'aire du rectangle
height : Réel r1 : Réel Sphere Cylinder } * @return l'aire du rectangle
width : Réel r2 : Réel r : Réel */
r : Réel
h : Réel public double area() {
perimeter() perimeter() /** Cette classe gere des carrés
volume() */ return width * height;
créer(name, width, heigth) créer(r1, r2) volume() }
créer(r) public class Square extends Rectangle {
area() area() créer(r, h)
area()
area() /** Calcule le perimetre du rectangle
/** Crée un carre
* @param name le nom du carre * @return le perimetre du rectangle
* @param side la longueur du coté du carré */
Square Circle public double perimeter() {
*/
public Square(String name, double side) { return 2 * (width + height);
créer(side) créer(r) }
super(name, side, side);
} }
51 } 52
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en
Exercice : la classe "principale" de l'application J
import Rectangle;
av
a Regroupement des classes : les
Importation des déclarations d'interfaces
import Square;
import Circle; de toutes les classes référencées, Paquetages
// ... nécessaire si elles ne sont pas dans le
même répertoire… (ou package)
public class ShapeTest {
public static void main(String[] args) { • La notion de paquetage (ou package) permet de
System.out.println("Je cree un tableau de Shape");
Shape shapes[] = { Création du tableau de regrouper des classes faisant partie d'une même
new Rectangle("mon rectangle", 10.0, 20.0), références
new Square("mon carre", 5.0), structure logique ou thématique
new Ellipse("mon ellipse", 4.0, 3.0),
new Circle("mon cercle", 2.0), Appel de la méthode de • Une organisation hiérarchique des paquetages est
new Sphere("ma sphere", 15.0),
new Cylinder("mon cylindre", 3.0, 5.0)
calcul selon le type précis de possible
}; chaque classe du tableau
(grâce au mécanisme de
// On affiche les figures contenues dans le tableau
for(int i=0; i < shapes.length; i++) { polymorphisme) • Permet de référencer globalement toutes les
System.out.print("objet " + shapes[i].name + " : aire=" + shapes[i].area() );
if (shapes[i] instanceof Shape2D)
classes d'un même paquetage
System.out.println(" perimetre=" + ( (Shape2D)shapes[i]).perimeter() );
else if (shapes[i] instanceof Shape3D) • Évite une éventuelle confusion entre 2 classes de
System.out.println(" volume=" + ( (Shape3D)shapes[i]).volume() );
} même nom appartenant à des paquetages
System.out.println("J'ai fini mon boulot");
} différents
}
53 54
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

9
en en
J J
Paquetages av
a Exercice : suite... av
a
• Le nom d'une classe dans un paquetage standard est
– Déploiement dans des packages
généralement construit :
NomDeFournisseur.NomDeCatégorie.NomDeClasse • Déployez ces classes dans les packages :
exemple : java.awt.Graphics – shape

• Possibilité de définir ses propres paquetages • shape.shape2D


• shape.shape3D
• L'appartenance d'une classe à un paquetage est définie en
– Comptabilisation des instances
début de fichier, exemple :
package shape.shape3D • Ajoutez des variables de classes (count) comptabilisant le nombre
d'instances des classes Shape, Shape2D et Shape3D (prévoir le cas de
• Nécessité pour la machine virtuelle d'organiser les fichiers suppression d'instances).
de classes dans une arborescence de répertoires similaire à – Génération de la documentation
la hiérarchie des paquetages.
• Insérez des commentaires conformes aux spécifications de l'utilitaire
• Importation globale des déclarations d'interfaces de toutes javadoc et générez la documentation HTML des packages avec cet
les classes d'un paquetage, exemple : outil.
import shape.shape2D.*
55 56
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

en en
Exercice : ... J J
package shape;

public abstract class Shape {


av
a Exercice... av
a
package shape.shape2D;
import shape.*;
public static int count = 0;
public String name; public abstract class Shape2D extends shape.Shape { import shape.shape2D.*;
import shape.shape3D.*;
public Shape(String name) { public static int count = 0; // différent de Shape.count !
count++;
this.name = name; public Shape2D(String name) { public class ShapeTest {
} super(name); public static void main(String[] args) {
count++;
protected void finalize() throws Throwable { }
System.out.println("Shape.finalize"); Shape shapes[] = {
count--;
super.finalize(); protected void finalize() throws Throwable { new Rectangle("mon rectangle", 10.0, 20.0),
} System.out.println("Shape2D.finalize"); new Square("mon carre", 5.0),
... count--;
super.finalize();
new Ellipse("mon ellipse", 4.0, 3.0),
package shape.shape2D;
} // ...
public class Rectangle extends Shape2D { ...
double width = 0.0; // On affiche le nombre d'instances dans chacunes des classes
double height = 0.0; System.out.println("Nombre de shapes : " + Shape.count);
public Rectangle(String name, double width, double height) { System.out.println("Nombre de shapes 2D :" + Shape2D.count);
super(name); System.out.println("Nombre de shapes 3D :" + Shape3D.count);
this.width = width; }
this.height = height;
}
}
...
57 58
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001 Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

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 !

59
Introduction à la POO - Philippe Marin séminaire PFIEV, Da Nang, Juin 2001

10