-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path04-associations.Rmd
166 lines (128 loc) · 4.43 KB
/
04-associations.Rmd
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# Les associations
## Association unidirectionnelle
Dans le cas d'une association unidirectionnelle, une classe A appelle une classe B, comme attribut, et peut l'utiliser comme un attribut normal : l'association est naviguable dans un sens uniquement.
> Si la classe A a une association unidirectionnelle sur la classe B, alors A connait B mais B ne connait pas A.
Méthodologie :
- en amont :
- on crée un projet : `MonProjet`
- on crée un package : `fr.lsarribouette.monprojet.metier`
- on crée deux classes : `MaClasseA.java` et `MaClasseB.java`
- dans `MaClasseA` :
- on ajoute un attribut objet dont le type est `MaClasseB` : `private MaClasseB instanceB;`
- on peux l'implémenter dans le constructeur
- on peux ajouter un getter et un setter
- dans la méthode `main` de la classe de test :
- on crée d'abord une instance de `MaClasseB`
- on crée ensuite une instance de `MaClasseA` qui utilise l'instance de `MaClasseB`
### Exemple simple
Association unidirectionnelle entre un étudiant et son université :
Projet en trois fichiers (*Universite.java*, *Etudiant.java* et *TestAssociationUnidir.java*) où la méthodologie expliquée au chapitre \@ref(creation-classe) est appliquée.
**Universite.java** :
```{java, eval=FALSE}
package fr.lsarribouette.associonsnous;
public class Universite {
// attributs d'instance
private String nom;
private String ville;
private int nbEleves;
// constructeurs
public Universite(String nom, String ville) {
this.nom=nom;
this.ville=ville;
}
// assesseurs et mutateurs
// choix : get nbEleves, nom, ville
// set nbEleves
public int getNbEleves() {
return nbEleves;
}
public String getNom() {
return nom;
}
public String getVille() {
return ville;
}
public void setNbEleves(int nbEleves) {
this.nbEleves = nbEleves;
}
// toString
// TODO supprimer avant mise en production
@Override
public String toString() {
return "Universite [nom=" + nom + ", ville=" + ville + ", nbEleves=" + nbEleves + "]";
}
}
```
**Etudiant.java** :
```{java, eval=FALSE}
package fr.lsarribouette.associonsnous;
public class Etudiant {
// attributs d'instance
private String prenom;
private int age;
private String niveauEtudes;
private Universite univ; // attribut objet
// constructeurs
public Etudiant(String prenom, Universite univ) {
this.prenom=prenom;
this.univ=univ; // implementation normale
}
// assesseurs et mutateurs
// choix : get prenom, age, niveauEtudes, univ
// set age, niveauEtudes, univ
public String getPrenom() {
return prenom;
}
public int getAge() {
return age;
}
public String getNiveauEtudes() {
return niveauEtudes;
}
public Universite getUniv() {
return univ;
}
public void setAge(int age) {
this.age = age;
}
public void setNiveauEtudes(String niveauEtudes) {
this.niveauEtudes = niveauEtudes;
}
public void setUniv(Universite univ) {
this.univ = univ;
}
// toString
// TODO supprimer avant mise en production
@Override
public String toString() {
return "Etudiant [prenom=" + prenom + ", age=" + age + ", niveauEtudes=" + niveauEtudes + ", univ=" + univ
+ "]";
}
}
```
**TestAssociationUnidir.java** :
```{java, eval=FALSE}
package fr.lsarribouette.associonsnous;
public class TestAssociationUnidir {
public static void main(String[] args) {
// un eleve connait son universite, mais pas l'inverse
Universite univBordeaux = new Universite("Universite de Bordeaux", "Bordeaux");
Etudiant bob = new Etudiant("Bob",univBordeaux);
System.out.println(univBordeaux); // Universite [nom=Universite de Bordeaux, ville=Bordeaux,
// nbEleves=0]
System.out.println(bob); // Etudiant [prenom=Bob, age=0, niveauEtudes=null,
// univ=Universite [nom=Universite de Bordeaux, ville=Bordeaux, nbEleves=0]]
}
}
```
## Association bidirectionnelle
Dans le cas d'une association bidirectionnelle, les classes A et B s'appellent mutuellement, comme attributs. Elles peuvent utiliser leurs attributs croisés : l'association est naviguable dans les deux sens.
> Si les classes A et B ont une association bidirectionnelle, alors A connait B mais B connait aussi A.
Méthodologie : // à compléter
> Seule une implémente l'autre dans son constructeur, sinon c'est le serpent qui se mord la queue.
*çàd* un seul constructeur avec `this` pour un attribut objet.
### Exemple simple
```{java, eval=FALSE}
// à compléter
```
## Toutes les associations