UML, diagrammes de classes
Les classes
La notion de classe est essentielle en programmation orientée objets : elle définit une abstraction, un type abstrait qui permettra plus tard d’instancier des objets. On distingue généralement entre classes abstraites (qui ne peuvent pas être instanciées) et classes « normales », qui servent à définir des objets.
Classes abstraites
Une classe abstraite ne peut donc pas être utilisée pour fabriquer des instances d’objets; elle sert uniquement de modèle, que l’on pourra utiliser pour créer des classes plus spécialisées par dérivation (héritage). Une classe abstraite est assez proche de la notion d’interface; d’ailleurs, la notion d’interface est généralement implémentée par une classe abstraite, dont toutes les méthodes sont purement virtuelles, en C++ (rappelons que C++ ne connaît pas la notion d’interface).
Le + dénote la publication du membre concerné. Une classe abstraite peut posséder des membres privés ou des attributs privés ou publics; d’autre part, les méthodes peuvent faire l’objet d’une implémentation, même si la méthode est purement virtuelle.
Classes non abstraites
Une classe « normale » ne contient pas de membres abstraits. Sa représentation en UML correspond à la figure9.6, page99.
Noter les petits signes « cabalistiques » précédant l’identification des méthodes :
• – dénote un membre privé
• + dénote un membre public
• # dénote un membre protégé
D’ailleurs, la projection en Java est parfaitement claire à ce sujet (figure9.7, page99).
Les relations entre les classes
Les diverses classes possèdent des relations de dépendance entre elles. Ces relations possèdent en principe un équivalent syntaxique dans le langage de projection. Les principales de ces relations sont énumérées dans la suite. Il est néanmoins important de noter que certaines relations peuvent ne pas avoir d’équivalent dans le langage de projection considéré. Ainsi, C++ introduit la notion de template, ou classe paramétrable, qui peut être modélisée en UML, mais qui représente une notion inconnue en tant que telle en Java. A l’inverse, Java permet de définir une classe qui implémente un interface, alors que la notion d’interface est inexistante en C++. Dans les deux cas, l’outil de modélisation, s’il génère du code, choisira le mode de représentation le mieux adapté en considération du langage de projection choisi. Un interface UML pourrait, par exemple, se traduire par une classe abstraite en C++.
Héritage
L’héritage constitue une relation de spécialisation. Elle est notée, en UML, par une flèche allant de la classe spécialisée vers la classe originale (de la classe vers la superclasse).