L’héritage une relation de spécialisation/généralisation.
1 2 3 |
|
Le mot clé extends
en Java n’a rien à voir avec le mot clé extends
en UML, employé en particulier dans les diagrammes de cas d’utilisation.
afficher()
La classe enfant (celle qui hérite) possède toutes les propriétés de ses classes parents (attributs et opérations)
Elle n’a accès qu’aux propriétés publiques (comme tout le monde) et protégées de ses parents. Le propriétés publiques restent masquées pour les enfants.
La signature d’une opération est constituée de son nom et de ses paramètres (pas de sa valeur de retour).
La surcharge d’opérations (même nom, mais signatures des opérations différentes) est possible dans toutes les classes.
Polymorphisme :
Substitution : une instance d’une classe peut être utilisée partout où une instance de sa classe parent est attendue (par exemple, toute opération acceptant un objet d’une classe Animal doit accepter tout objet de la classe Chat (l’inverse n’est pas toujours vrai).
Une opération est dite abstraite lorsqu’on connaît sa signature mais pas la manière dont elle peut être réalisée (en UML, on écrit son nom en italique).
Une classe est dite abstraite lorsqu’elle définit au moins une méthode abstraite ou lorsqu’une classe parent contient une méthode abstraite non encore réalisée (en UML, on écrit son nom en italique).
Il est impossible d’instancier directement une classe abstraite.
Une classe peut avoir plusieurs classes parents. On parle alors d’héritage multiple.
L’emploi de l’héritage multiple est souvent peu justifié et d’autres solutions de conception sont souvent préférables.
Les interfaces sont très utilisées en COO et en POO. On les utilise d’ailleurs plus régulièrement que l’héritage, par exemple.
Le rôle d’une interface est de regrouper un ensemble d’opérations assurant un service cohérent que des classes sont susceptibles d’offrir. On peut ainsi définir des classes clientes (ici, Page
) avant d’avoir défini toutes les implémentations requises de l’interface.
Selon le principe de substitution
, on pourra employer une classe réalisant une interface partout où l’interface est attendue.
<< interface >>
avant le nom de l’interface.L’association la plus utilisée est l’association binaire (reliant deux classes).
Parfois, les deux extrémités de l’association pointent vers la même classe. Dans ce cas, l’association est dite réflexive.
Instanciée, une association réflexive fait intervenir plusieurs objets. Par exemple :
Categorie
joue le rôle de categoriePrincipale
sousCategorie
Artité des associations :
Il arrive que ce ne soit pas suffisant. Dans ce cas, on peut définir des relations n-aires.
Pour déterminer les multiplicités d’un côté, on considère le nombre d’objets liés à un (n-1)-uple quelconque formé d’objets de tous les autres côtés
Ces associations se rencontrent assez rarement en pratique. Dans la plupart des cas, il est en effet plus pertinent d’utiliser une classe-association.
Par défaut, les attributs correspondent à des variables d’instance, dont la valeur peut changer pour chaque instance de la classe considérée.
Les attributs de classe sont des variables dépendant des classes et pas de leurs instances.
static
en Java)Pour définir une classe générique et paramétrable en fonction de valeurs et/ou de types :
Il est recommandé de mettre dans des paquetages (packages) différents les éléménts qui ont un raport plus étroi les uns avec les autres.
Ici, par exemple, on identifie un package pour les éléments liés aux aspects commerciaux, et un autre pour les éléménts concernant le catalogue de produits.
A la manière de dossiers, on peut imbriquer des packages dans d’autres packages.
Chaque classe dispose d’un nom absolu et non ambigu Package::SousPackage::NomClasse
. Exemple : java.lang.String
.
Ce type d’association est le plus courant, et heureusement le plus simple à impélmenter.
1 2 3 4 |
|
1 2 3 4 |
|
Il faut maintenir la cohérence des référencements dans les deux sens. Un simple
1 2 3 4 5 6 7 8 9 10 |
|
Il faut également définir l’opération symétrique dans B
.
C’est paradoxalement plus complexe que le cas bidirectionnel :
En pratique, on peut réfléchir à la nécessite de la multiplicité maximale de 1 à la source.
Si elle est vraiment justifiée, on peut admettre qu’un développeur code en réalité une association bi-directionnelle et joue sur les modificateurs d’accès pour rendre la relation plus asymétrique.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
A faire en exercice pour la prochaine scéance ;)
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
En pratique, on se ramène à un cas comme :
A faire également pour la prochaine scéance ;)