Title: 4ime Classe Mercerdi, 27 octobre CSI2572
14ième Classe (Mercerdi, 27 octobre)CSI2572
2Aggrégation
- L'agrégation est un type de relation entre deux
classes qui traduit les relations Est composé de
... ou Possède ou, dune façon plus
générale, a (En anglais Has a). - Par exemple, dans un système mécanique, on
pourrait considérer que la classe Voiture est
composée d'une instance de la classe Moteur,
quatre instances de la classe Roue et une
instance de la classe Chassis. - L'instanciation passe nécessairement pas
l'utilisation d'attributs qui sont eux mêmes des
objets ou des pointeurs sur des objets ou même
une instance d'une classe conteneur qui elle
réalise effectivement l'agrégation.
3class Y public Y() Y(int) class
C protected int c Y y public
C() C(int) C operator(const C)
C()
4YY() cout ltlt "YY()" ltlt endl YY(int)
cout ltlt "YY(int)" ltlt endl CC() y(2),
c(5) cout ltlt "CC()" ltlt endl CC(int
i) y(3), c(j) cout ltlt "CC(int)" ltlt endl
C Coperator(const C v) c v.c y
v.y cout ltlt "Coperator" ltlt endl return
this CC() cout ltlt "CC()" ltlt endl
5Aggrégation
- Le constructeur de la classe C commence par
initialiser l'objet y en appelant son
constructeur avant d'initialiser l' attribut
atomique c. -
- Très important s'il est possible d'affecteur
leur valeur aux attributs atomiques à l'intérieur
du corps du constructeur, il est obligatoire
d'initialiser les attributs objets dans la liste
d'initialisation du constructeur à moins que
l'objet ne dispose d'un constructeur par défaut,
auquel cas, celui-ci sera appelé avant
l'exécution du corps du constructeur. - Si vous ne disposez pas d'un constructeur par
défaut ou ne pouvez pas faire l'initialisation de
l'objet dans la liste d'initialisation, car, par
exemple, elle nécessite des calculs importants,
alors, vous serez obligés de recourir à un
pointeur comme dans l'exemple suivant
6class C protected int c Y y
public C() C(int) C
operator(const C) C() CC()
c(5) y new Y(2) CC(int i)c(j) y
new Y(3)
7 C Coperator(const C v) c v.c delete
y y new Y((v.y)) return this
CC() delete y y NULL
8Aggrégation externe
- Il est aussi possible que l'objet agrégé ne
soit pas créé par l'objet agrégateur, mais
utilise plutôt un objet en provenance de
l'extérieur. 2 possibilités agréger par
référence ou par pointeur. - Si vous agrégez par référence, la référence doit
impérativement être initialisée dans la liste
d'initialisation comme dans l'exemple suivant -
9 class ObjetGraphique public
ObjetGraphique( Point p, int couleur,
int epaisseur) pointBase_(p)
couleur_couleur epaisseur_epaisseur
private int epaisseur_ int
couleur_ Point pointBase_
10En dehors de la liste d'initialisation, ca se
fait de cette manière
class ObjetGraphique public
ObjetGraphique( Point p, int
couleur, int epaisseur) couleur_
couleur epaisseur_ epaisseur
pointBase_ p private int
epaisseur_ int couleur_ Point
pointBase_
11Aggrégation accès
class ObjetGraphique private Point
pointBase_ const Point ObjetGraphiquepo
intDeBase(void) const return pointBase_
class ObjetGraphique private Point
pointBase_ const Point
ObjetGraphiquepointDeBase(void) const
return pointBase_
class ObjetGraphique private Point
pointBase_ const Point
ObjetGraphiquepointDeBase(void) const
return pointBase_
- Lorsque vous désirez renvoyer un accès en
lecture à un objet agrégé, le plus simple dans ce
cas sera de renvoyer une référence constante.
12Surcharge d'opérateur
- Commes les fonctions, les opérateurs en C
peuvent être redéfinis (surchargés). - Nous avons déja vu la surcharge de l'opérateur
d'assignation - Surcharger un opérateur consiste à en définir le
comportement tel qu'il s'applique à un objet. On
ne peut pas changer la pluralité des opérateurs,
ni leur priorité. - Il est possible de surcharger tous les
opérateurs, sauf - . . ?
13Surcharge d'opérateur
- Les opérateurs suivant peuvent tous être
redéfinis - () -gt
- - -- ! new new delete
- /
- -
- ltlt gtgt
- lt lt gt gt
- !
-
-
-
-
-
- -
- ,
14class point private float abscisse,
ordonnee public point() point(float,flo
at) void afficher () point operator
(point) float operator (point) point
pointoperator (point p) point
resultat resultat.abscisse abscisse
p.abscisse resultat.ordonnee ordonnee
p.ordonnee return resultat float
pointoperator (point p) return (abscisse
p.abscisse ordonnee p.ordonnee)
Surcharge d'opérateur
15Surcharge d'opérateur
- La syntaxe est
- ltresultatgt operatorlttype d'operateurgt(ltargumentsgt)
... - L'opérateur est le seul à être prédéfini pour
toutes les classes ab - Par défaut, il affecte aux variables de champs de
l'objet a les valeurs des variables de b. Il est
important de le surcharger lorsque certaines
variables de champs sont ltltcompliquéesgtgt.
16Surcharge d'opérateur
- p1 p2 est alors équivalent à p1.operator
(p2) - C'est la méthode de l'instance de gauche qui est
appelée. Donc, si on définit - point pointoperator (int x)
- point resultat resultat.abscisse abscisse
x resultat.ordonnee ordonnee return
resultat - L'appel suivant est légal
- p1 3
- Mais celui ci ne l'est pas
- 3 p1
17Surcharge d'opérateur
class chaine int lg char buf //...
public //... char operator(int i)
char chaineoperator(int i)
assert ( i lt lg ) return(bufi)
assert est une macro qui est évaluée comme une
instruction conditionnelle. Si expression
retourne zéro, assert affiche un message d'erreur
sur stderr et appelle la fonction abort pour
finir le programme.
18Héritage
- L'héritage est le second des trois principes
fondamentaux du paradigme orienté objet. Il
reprend le principe naturel de Généralisation /
Spécialisation. - Les systèmes réels se prêtent souvent à une
classification hiérarchique des éléments qui les
composent. Le principe est basé sur l'idée qu'un
objet spécialisé bénéficie ou hérite des
caractéristiques de l'objet le plus général
auquel il rajoute ses éléments propres. - En terme de concepts objets cela se traduit de
la manière suivante - On associe une classe au concept le plus
général, nous l'appellerons classe de base ou
classe mère ou super - classe. - Pour chaque concept spécialisé, on dérive une
classe du concept de base. La nouvelle classe est
dite classe dérivée ou classe fille ou
sous-classe
19(No Transcript)
20L'héritage
- Remarquez que Cercle et Ligne redéfinissent les
méthodes Afficher et Effacer en effet, un
cercle ne s'affiche pas de la même manière qu'une
ligne cest le polymorphisme appliqué aux
méthodes Afficher et Effacer dans le cadre des
classes Ligne et Cercle. - Concepts UML rapide
- En notation UML, la relation d'héritage est
signalée par une flèche à l'extrémité
triangulaire et dont la pointe est orientée vers
la classe mère. - Les méthodes dont le nom est en italique sont
abstraites. Les classes dont le nom est italique
sont également abstraites (ne peuvent pas
directement produire dinstances) - Les méthodes ou les attributs soulignés sont des
membres de classe.
21OO Design
modélisation d'un parc de véhicules
22L'héritage (syntaxe C)
- NomClasseDérivée publicprivateClasseBase1
- ,publicprivate ClasseBaseI1..n
- déclaration de classe
-
- Exemples
- class Cercle public ObjetGraphique
- class TexteGraphique public ObjetGraphique,
public Chaine - class Pile private Vecteur
23Le rôle des modificateurs d'héritages
Rappel Un attribut protected nest pas
accessible à lextérieur de la classe mais lest
aux classes dérivées. Par contre, à l'inverse
d'un attribut private, il respecte le principe
dencapsulation tout en favorisant la
transmission des attributs entre classe mère et
classe fille. Le tableau suivant récapitule les
accès fournis par ces trois modificateurs Modifi
cateur Visibilité (sous classes) Visibilité
(extérieur) private Non Non protected
Oui Non public Oui Oui
24Le rôle des modificateurs d'héritages
Le modificateur d'héritage peut être public ou
private. Il conditionne la visibilité des membres
de la classe mère dans la classe dérivée. Le
tableau suivant indique à quel accès est associé
un membre de la classe mère dans la classe fille
en fonction du modificateur dhéritage
25Construction - Destruction
- Le constructeur dune classe dérivée appelle
toujours les constructeurs de ses classes mères
avant de construire ses propres attributs. De
même, les destructeurs des classes mères sont
automatiquement appelés par le destructeur de la
classe fille. - donc
- Vous spécifiez vous même l'appel au constructeur
de la classe mère - ou
- Vous ne le spécifiez pas, et il y a appel
automatique du constructeur par défaut de la
classe mère. Si celui-ci n'existe pas, le
compilateur envoie un message d'erreur
26Classes Abstraites
- Une classe est dite abstraite si elle ne possède
pas dinstance. Cest forcément le cas si elle ne
fournit pas d'implémentation pour certaines de
ces méthodes qui sont dites méthodes abstraites.
Il appartient donc à ces classes dérivées de
définir du code pour chacune des méthodes
abstraites. On pourra alors parler de classes
concrètes les classes concrètes étant les
seules à même dêtre instanciées. - Les classes abstraites définissent un cadre de
travail pour les classes dérivées en proposant un
ensemble de méthodes que l'on retrouvera tout au
long de l'arborescence. Ce mécanisme est
fondamental pour la mise en place du
polymorphism. En outre, si l'on considère la
classe Véhicule, il est tout à fait naturel
qu'elle ne puisse avoir d'instance un véhicule
ne correspond à aucun objet concret mais plutôt
au concept d'un objet capable de démarrer,
ralentir, accélérer ou s'arrêter, que ce soit une
voiture, un camion ou un avion.