|
|
4.2.8 Généralisation spécialisation ou
héritage
- Factorisation de caractéristiques (attributs et opérations)
précédent suivant
Le but de la généralisation est la factorisation des
caractéristiques de plusieurs classes appelées classes enfants dans une classe appelée classe parente. Cette mise en commun des attributs (structures de données)
et des opérations (services) est le mécanisme de réutilisation le plus
important de l’orientation objet. La factorisation intervient aussi bien
en définissant une partie d’état commune (attributs) qu’en
extrayant les comportements communs (opérations). La classe parente rassemble
donc les attributs et les opérations communes des classes initiales qui
deviennent des classes enfants. La généralisation spécialisation
s’appelle aussi un héritage et exprime intuitivement le fait que les
classes enfants « héritent » des caractéristiques de leurs classes
parentes. La généralisation exprime une relation de type « est-un »
ou « est-une-sorte-de ». En outre, le terme
« généralisation » exprimant la factorisation des caractéristiques
communes dans la classe parente, le terme « spécialisation » exprime
quant à lui le fait que les classes enfants possèdent les caractéristiques de
leurs classes parentes avec la possibilité de les spécialiser soit par des
ajouts soit par des redéfinitions (voir plus loin). En d’autres termes,
une classe enfant possède les capacités de sa classe parente plus quelques
autres.
Généralisation spécialisation et sous-typage :
- un objet Personne peut
désigner une instance des classes Personne,
Avocat, Vendeur, Enseignant,
Vacataire et Permanent ;
- un objet Enseignant peut
désigner une instance des classes Enseignant,
Vacataire et Permanent ;
- il ne peut pas désigner une instance des classes
Personne, Avocat et Vendeur.
L’exemple présenté dans cette diapositive illustre des
héritages dits « simples » dans le sens où les classes enfants ne
possèdent qu’une filiation. Il est possible d’avoir de
l’héritage multiple comme montré dans l’exemple du schéma qui suit.
Cette possibilité n’existe pas dans tous les langages de programmation
orientés objet. Nous déconseillons donc l’utilisation de l’héritage
multiple en modélisation car l’équipe de développement peut choisir un
langage ne proposant pas cette possibilité. Dans ce cas, le diagramme de
classes doit alors être adapté, compliquant ainsi la traçabilité depuis le
modèle d’analyse vers l’implantation. Le langage de programmation
choisi dans ce module, en l’occurrence Java, n’autorise pas
l’héritage multiple.
Enfin, de façon plus intrinsèque, nous déconseillons
l’utilisation de l’héritage multiple car il pose des problèmes
d’interprétation. Par exemple, que fait-on lorsqu’un attribut ou
une opération existe « en double » ou « triple » dans les
classes parentes. Dans l’exemple qui suit, dans la classe VoitureAmphibie, comment interprète-t-on l’opération
avancer() héritée de la classe parente
« racine » Véhicule et ensuite
spécialisée dans les classes parentes VéhiculeTerrestre et VéhiculeMarin ?
La figure qui suit montre une visualisation du concept de
généralisation / spécialisation multiple. L’ensemble des objets de la
classe VoitureAmphibie représente
l’intersection des ensembles d’objets des deux classes parentes,
VéhiculeTerrestre et VéhiculeMarin.
Cf. le glossaire pour la définition des termes
« généralisation spécialisation », « héritage », et
« généralisation spécialisation multiple ».
D. Conan, C. Taconet, C. Bac,
Télécom SudParis, CSC 4002, Octobre 2015
|
|