Intro Pro Gob Jet

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Intro Pro Gob Jet as PDF for free.

More details

  • Words: 5,457
  • Pages: 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 – 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

Related Documents

Intro Pro Gob Jet
November 2019 25
Pro Jet
June 2020 33
Pro Jet
June 2020 18
Pro Jet
June 2020 22
Photos Pro Jet 4
July 2020 18
Pro Jet Ode Interface
November 2019 30