Associations reflexives


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.


Associations un à un 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.

Partie-Echec.jpg, 40kB
Représentation possible

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.

Exemple de projet

Voir le corrigé du projet Partie_Echec.

Associations un à un assymétriques

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.

Asso-Remorquer.jpg, 27kB
Représentation possible

Pour une représentation bidirectionnelle, on introduit deux attributs dans la même classe:

public class Voiture {
   Voiture remorque; 
   Voiture remorque_par;
   ...
}
Exemple de projet

Voir le corrigé du projet Remorquer.

Associations réflexives [1-N]

Une association [1-N] réflexive ne peut être qu'assymétrique. Nous prendrons ici l'exemple de l'association père-enfant.

Pere-Enfant.jpg, 38kB

Représentation possible

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.

Exemple de projet

Voir le corrigé du projet Parent.

Associations [N-N] symétriques

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.

Asso-Connaitre.jpg, 41kB

Représentation possible

On peut la représenter par un seul attribut déclaré comme une table associative:

public class Personne {
  String prenom;
  TreeMap <String,Personne> connait;
  ....
Exemple de projet

Voir le corrigé du projet Connaitre.

Associations [N-N] assymétriques

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.

Rendre_Service.jpg, 47kB

Représentation possible

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.

Exemple de projet

Voir le corrigé du projet Rendre_Service.