|
|
6.13 Traduction des relations de
généralisation spécialisation
- Dans les classes enfants, possibilité d’appel au
constructeur de la classe parente (si public ou protégé)
- Par exemple, dans la classe enfant ScrutinPlageHoraire :
constructeur(...) {
super(...) // appel au constructeur de la classe parente Scrutin
nbTotal = 0
}
- L’appel au constructeur de la classe parente doit
être la première instruction
- Dans les classes enfants, possibilité d’appel des
opérations de la classe parente (si publique ou protégée)
- Par exemple, dans la classe enfant ScrutinPlageHoraire :
afficherScrutin() { // opération redéfinie dans la classe enfant
super.afficherScrutin() // appel à l’opération de classe parente Scrutin
afficher à l’écran la valeur de l’attribut nbTotal
}
précédent suivant
Tous les algorithmes des principales opérations, ceux qui ne
sont pas triviaux, doivent être écrits pendant la phase de conception. Le rôle
de la programmation doit si possible être restreint à la traduction dans un
langage particulier (Java en ce qui nous concerne) et à l’utilisation de
canevas logiciels particuliers (par exemple, un canevas logiciel proposant des
mises en œuvre de listes, de collections, d’arbre et d’autres
structures de données complexes).
Cette diapositive présente une nouveauté importante de
l’orientation objet concernant l’écriture des algorithmes :
l’appel à partir d’une opération définie dans une classe enfant
d’opérations définies dans une classe parente. Lorsqu’un arbre de
généralisation spécialisation est tracé dans un diagramme de classes, certaines
opérations factorisées sont définies dans une classe parente, puis redéfinies
dans les classes enfants. Par définition, toute opération protégée ou publique
définie dans une classe peut être appelée dans le corps d’une opération
d’une classe enfant. Nous distinguons deux cas particuliers :
1) le constructeur de la classe, ou 2 ) une opération redéfinissant l’opération de la
classe parente appelée. Dans le premier cas, la notation « super() » permet d’appeler le constructeur de la
classe parente. Cet usage courant permet d’écrire le constructeur
d’une classe comme étant l’initialisation de la partie de
l’état gérée par / définie dans la classe parente, puis
l’initialisation des attributs spécifiques ajoutés dans la classe enfant.
Dans le second cas, il est important de se rappeler l’effet de « la
liaison dynamique ou tardive » (toujours active en Java) : si une
opération définie dans une classe est redéfinie dans une classe enfant, et si
c’est une référence sur un objet de type de la classe enfant qui est
utilisée, alors c’est l’opération de la classe enfant
(c’est-à-dire, l’opération de la classe spécialisée) qui est
appelée. Dans certains cas, l’opération dans la classe enfant est une
« extension » du corps de l’opération correspondante de la
classe parente. Dans ces cas, la notation « super.op() » permet
d’appeler explicitement l’opération de la classe parente
« op » dans le corps de
l’opération de la classe enfant.
D. Conan, C. Taconet, C. Bac,
Télécom SudParis, CSC 4002, Octobre 2015
|
|