Académique Documents
Professionnel Documents
Culture Documents
1
Les objectifs de la POO
Les objectifs ayant induit le développement de la programmation objet sont
essentiellement :
D’accroître la productivité des logiciels
D’augmenter leur fiabilité
Pour atteindre ces deux objectifs, deux critères essentiels ont permis d’arriver à
l’approche Orientée Objet (A.O.O.) :
L’extensibilité :
la possibilité d’étendre un logiciel lors d’un changement de spécification
sans trop modifier l’existant
La ré-utilisabilité
La possibilité de réutiliser des composants logiciels déjà existant dans de
nouvelles applications.
!!! Dans la vie d’un projet informatique, il semble que 60% à 80% des erreurs
soient des erreurs de conception ou de spécification
2
Diverses approches de conception
3
MÉTHODES DE CONCEPTION
Méthodes fonctionnelles
Méthodes systémiques
4
Méthodes fonctionnelles
Les méthodes fonctionnelles consistent à décomposer hiérarchiquement une
application en un ensemble de sous applications.
Ces méthodes utilisent les raffinements successifs pour produire des
spécifications taille sur les besoin
Points forts
Simplicité du processus de conception 2
Capacité à répondre rapidement aux besoins ponctuels des utilisateurs
Points faibles
Fixer les limites pour les décompositions hiérarchiques
Redondance (éventuelle) des données
5
Méthodes systémiques
Les méthodes systémiques sont influencées par les systèmes de Gestion de bases de
données en proposant une double démarche de modélisation :
La modélisation des données
La modélisation des traitements
Points forts
Approche globale prenant en compte la modélisation des données et des
traitements
Niveaux d’abstraction dans le processus de conception
Bonne adaptation à la modélisation des données et à la conception des BDs
Points faibles
Double démarche de conception : données et traitements
Pas de fusion possible des deux aspects (données et traitements)
6
MÉTHODES FONCTIONNELLES ET SYSTÉMIQUES
7
Méthodes fonctionnelles
Les méthodes fonctionnelles consistent à décomposer hiérarchiquement une
application en un ensemble de sous applications.
Ces méthodes utilisent les raffinements successifs pour produire des
spécifications taille sur les besoin
Points forts
Simplicité du processus de conception 2
Capacité à répondre rapidement aux besoins ponctuels des utilisateurs
Points faibles
Fixer les limites pour les décompositions hiérarchiques
Redondance (éventuelle) des données
8
Méthodes systémiques
Les méthodes systémiques sont influencées par les systèmes de Gestion de bases de
données en proposant une double démarche de modélisation :
La modélisation des données
La modélisation des traitements
Points forts
Approche globale prenant en compte la modélisation des données et des
traitements
Niveaux d’abstraction dans le processus de conception
Bonne adaptation à la modélisation des données et à la conception des BDs
Points faibles
Double démarche de conception : données et traitements
Pas de fusion possible des deux aspects (données et traitements)
9
MÉTHODES FONCTIONNELLES ET SYSTÉMIQUES
10
MÉTHODES ORIENTÉES OBJETS
11
Classe-Objet
Une classe est un modèle de la structure statique (les champs ou attributs) et du comportement
dynamique (les opérations ou méthodes) des objets (instances) associés à cette classe;
La classe décrit le domaine de définition d'objets. Chaque objet appartient à une classe. Les
généralités sont contenues dans la classe alors que les particularités dans les objets. Les objets
informatiques sont construits à partir de la classe par un processus appelé instanciation. De ce
fait tout objet est une instance de classe.
12
Une classe est définie par les attributs et les opérations (méthodes).
Attributs : Appelés également champs correspondent aux propriétés de la classe. Ils sont définis
par un nom, un type de données et éventuellement une valeur initiale. Un attribut est une variable
qui stocke des données.
Exemple : considérons la classe Employé caractérisée par les attributs code, nom et nbEmployés (nombre d'employés)
Les attributs code et nom sont des caractéristiques de chaque objet Employé contrairement au
champ nbEmployés qui est une caractéristique commune à tous les objets. On dira que
nbEmployés est attribut statique.
statique
Chaque objet, instance d'une classe, donne des valeurs particulières à tous les attributs définis
dans sa classe sauf les attributs statiques ce qui détermine son état.
Exemples :
13
L’héritage
L’héritage simple
Principe
Le but est de construire de nouvelles classes à partir de classes déjà
existantes ; C’est le mécanisme fondamental de la réutilisabilité.
Terminologie :
Classe de base
La classe dérivée se différencie de la classe de base :
Par enrichissement, c’est-à-dire par ajout de données et de méthodes
Par substitution, c’est-à-dire par redéfinition de fonctions membres
héritées de la classe de base.
Classe dérivée
Syntaxe :
Class < classe-dérivée> : {public, private, protected} <classe-de-
base>
14
l’héritage peut être :
Public
Private
Protected
Sans attribut( nous dirons << normal>>)
15
Divers niveaux de protection des informations
les membres d’une classe peuvent être :
Soit private
private, auquel cas ils ne sont accessibles qu’aux membres de
la classe ;
Soit public
public, et là ils sont accessibles aux membres de la classe et
aux classes clientes.
En C++, une classe dérivée n’a pas accès aux membres privés de la
classe de base.
Dans la pratique, la classe dérivée doit presque toujours avoir
accès aux attributs en capsulés de la classe de base.
C++ a créé un niveau de protection intermédiaire, le niveau
protected : les membres protected sont inaccessibles aux classes
clientes, mais accessible aux membres de la classe et aux classes
dérivées.
16
Figure9
17
Figure9
18
Figure9
19
Figure9
20
Récapitulation
Quelque soit l’héritage :
Une classe dérivée a accès aux membres public et protected de la
classe de base.
Une classe cliente d’une classe dérivée a accès aux membres public de
cette dernière.
En général, sauf pour l’héritage private ou protected
Si B dérivée de A, et si C dérive de B, la classe C a accès aux membres
publics et protected de A (transitivité).
21
Particularités de l’héritage private
class B : private A{ } ;
class C: B{ };
La classe B a accès aux membres public et protected de
A. Mais ils deviennent private pour B, ce qui signifie
que C mais ne pourra pas y’accéder.
22
Particularités de l’héritage Protected
23
Particularités de l’héritage public
Une classe cliente de la classe dérivée à accès aux membres
publics de la classe dérivée ainsi qu’aux membres publics de la
classe de base.
Figure9
24
Constructeur et destructeur dans la classe
dérivée
Une classe dérivée peut avoir ses constructeurs.
Quand la classe de base et la classe dérivée ont leurs
constructeurs, le constructeur de la classe de base est
appelé en premier, puis le constructeur de la classe
dérivée.
Il est possible d’appeler explicitement le constructeur de
la classe de base dans la définition du constructeur de la
classe dérivée ( juste après l’en-tête suivi de :).
25
Exemple :
#include <iostream.h>
class point
{ protected :
int abscisse;
int ordonnée;
public :
point(int=0,int=0);
void affiche();
void deplacer(int);
};
classe pointForme : public point
{ private :
char forme;
public:
pointFome(int=0, int=0, char='*');
void deformer(char);
void afficher();
};
partie interface doit être mise dans le fichier d’entête point..h
26
La partie implémentation de la classe dérivée sera :
#include " point.h "
#include"pointforme.h"
#include <iostream.h>
27
le destructeur
Pour le destructeur l'ordre d'appel est
inverse: c'est le destructeur de la classe
dérivée qui est appelé en premier, puis
le destructeur de la classe de base.
28
L’héritage multiple
29
Structure des instances de la classe dérivée :
Les champs des instances de la classe dérivée sont constitués
de l’union des champs propres à la classe dérivée et des
champs des classes de bases. Même chose, en ce qui
concerne les méthodes
On peut être amené à utiliser l’opérateur de
résolution de portée ::, si :
un membre m d’une des classes de base est redéfini dans la
classe dérivée Deux classes de base ont un membre m de
même nom
30
Class pointForme : public point, public Forme
{ public :
pointForme(int=0, int=0, char=’*’) ;
void affiche() ;
}
l’implémentation de la classe dérivée pourra être :
#include "point.h"
#include "forme.h"
#include "pointforme.h"
31
Problèmes liés à l’héritage multiple
B C
32
Pour éviter la duplication des champs, il faut utiliser
des clases virtuelles. Les classes de base dont on veut
éviter la duplication doivent être déclarées virtuelles.
Class B : public virtual A{…};
Class C:public virtual A{….};
Class D:public B,public C{…};
A B m
m A B m
m C C
33
Constructeur
La création d’un objet de la classe dérivée provoque l’appel du constructeur de chacune
des classes de base dans l’ordre des déclarations.
Considérons les spécifications suivantes:
class point
{ protected :
int abscisse;
int ordonnee;
public:
point (int =0, int=0);
void affiche();
void deplcer(int);
};
class forme
{protected :
char forme;
public :
forme( char='*');
void affiche');
void deformer(char);
};
34
Les méthodes virtuelles
sous-typage
La dérivation correspond à une opération de sous-typage.
Un objet de la classe dérivée peut être affecté à un objet de la classe de
base. Mais l’inverse n’est pas possible sans une conversion de type
explicite
Exemple :
Class point {…} ;
Class PointForme : public Point{…} ;
….
Point p ;
PointForme q ;
…
p=q ; //affectation légale
q=p ; //illégal
35
L’affectation p=q provoque une conversion
automatique de type.
Le fonctionnement est analogue pour les
pointeurs : un pointeur sur une classe dérivée
sera implicitement converti en un pointeur vers
la classe de base.
Point *pP ;
PointForme *pPf ;
PP=pPf ;//legal
36
Typage statique
Le type des objets est défini au moment de la
compilation.
Dans le cas d’une redéfinition de méthode, c’est
toujours la méthode de la classe de base qui va
être appelée, même s’il y’a conversion implicite
de type dans la classe de base.
37
Méthode f() publique
A
38
Aa;
Bb;
C c;
A *p;
P=&a;
p->f();// c’est f() de A qui est appelée : Normal!!
39
Méthodes virtuelles et typage dynamique
Dans l’exemple précédent, si les méthodes f() sont déclarées virtuelle
dans la classe de base A, c’est toujours la bonne méthode qui
s’appliquera en fonction du type réel des objets.
Une redéfinition de la méthode virtuelle dans une classe dérivée est
implicitement virtuelle (l’attribut virtual n’est plus nécessaire). Pour
déclarer une virtuelle il suffit de placer l’attribut virtual en tête de son
type prototype :
Class A
{…
public :
virtual void f();
…
};
Quand la méthode f() est appelée, le compilateur ne décide pas quelle
est celle qui va être appelée. Le choix sera fait au moment de
l’exécution : c’est qu’on appelle la ligature dynamique ou typage
dynamique.
40
Classes abstraites et méthodes virtuelles pures
Une méthode virtuelle pure est une méthode dont la
définition est nulle.
….
….
Virtual void f()=0 ;
….
Une méthode virtuelle pure d’une classe de base doit
obligatoirement être redéfinie dans les clases dérivées.
Une classe abstraite est une classe contenant au moins
une fonction virtuelle pure.
Une classe abstraite ne peut être instanciée.
41
Exemple 1 class chien: public Animal
Class Animal { public :
{ public : void crier();};
class Oiseau: public Animal
virtual void crier()=0 ;
{public :
};
void crier();
class chat:public Animal };
{public : void crier();
};
42
void chat:: crier()
{cout <<”\n miaou ! miaou!\n”;}
void main()
{Animal * pa[3] ;
pa[0]=new Chat ;
pa[1]=new Chien;
pa[2]=new Oiseau;
for(int I=0; I<3;I++) pa[I]->crier ();}
44
Supposons que nous désirons écrire un
programme client utilisant un tableau
mélangeant les trois types d’objets.
Plus particulièrement, nous voulons afficher
les éléments d’un tableau initialisé lors de
l’exécution. Pour chaque élément, il faudra
utiliser la méthode afficher() de sa classe,
dynamiquement.
Pour cela, nous allons créer une classe
abstraite dont vont dériver Point, Vecteur et
Matrice.
45
Classe abstraite
Matrice
Point Vecteur
46