Rappelons que les associations réflexives sont des associations entre objets de la même classe. Comme pour les associations non reflexives ont peut les classifier en associations [1-1], [1-n] ou [n-n]. Par contre, dans le cas des associations réflexives, les associations [1-1] ou [n-n] peuvent être symétriques.
Une association un à un symétrique est une association entre deux objets de la même classe dans laquelle les deux objets jouent le même rôle.
Prenons par exemple la représentation d'un tournoi d'échec. Chaque partie d'échec peut être vue comme une association [1-1] entre deux personnes. En faisant abstraction de la couleur des pièces, chaque joueur joue le même rôle dans cette association. Il s'agit donc d'une association symétrique.
Il suffit d'introduire un pointeur vers l'adversaire:
public class Personne { Personne joue_avec; ... }
On remarquera, qu'une association symétrique est forcément bidirectionnelle.
Voir le corrigé du projet Partie_Echec.
Une association un à un assymétrique est une association entre deux objets de la même classe dans laquelle les deux objets jouent un rôle différent.
L'association remorquer est de cette nature: une voiture ne peut remorquer qu'au plus une voiture et les deux voitures en relation jouent un rôle différent: il y a la voiture qui remorque et celle qui est remorquée.
Pour une représentation bidirectionnelle, on introduit deux attributs dans la même classe:
public class Voiture { Voiture remorque; Voiture remorque_par; ... }
Voir le corrigé du projet Remorquer.
Une association [1-N] réflexive ne peut être qu'assymétrique. Nous prendrons ici l'exemple de l'association père-enfant.
Voici une représentation bidirectionnelle de cette association:
public class Personne { String prenom; Personne pere; TreeMap <String,Personne> les_enfants;
L'attribut pere pointe vers le père de la personne et l'attribut les_enfants est une table associative contenant l'ensemble de ses enfants. Nous avons supposé ici que le prénom suffit à identifier la personne, ce qui nous permet d'utiliser cet attribut comme clé de la table.
Voir le corrigé du projet Parent.
Une association réflexive [N-N] symétrique est une association [N-N] entre objets d'une même classe dans laquelle les objets en relation jouent le même rôle.
Nous avons déjà vu un exemple d'une telle association en introduction: il s'agit de l'association connaitre entre personnes.
On peut la représenter par un seul attribut déclaré comme une table associative:
public class Personne { String prenom; TreeMap <String,Personne> connait; ....
Voir le corrigé du projet Connaitre.
Dans une association réflexive [N-N] assymétrique, les objets en relation jouent des rôles différents.
Exemple: l'association rendre_service. Une personne peut rendre service a plusieurs personnes et inversement, plusieurs personnes peuvent rendre service à la même personne.
Voici une représentation bidirectionnelle de cette association:
public class Personne { String prenom; TreeMap <String,Personne> a_rendu_service_a; TreeMap <String,Personne> ont_rendu_service; ...
en utilisant le prénom comme clé des deux tables associatives.
Voir le corrigé du projet Rendre_Service.