Composition des objets
CHAPITRE 11
242
Remarques
1 Ce canevas ne serait pas utilisable dans un langage gérant les objets par valeur, puisque
alors un objet de classe Singleton contiendrait, non plus une référence vers un objet de
ce type, mais un objet (complet), ce qui, bien entendu, n’est pas possible : un objet ne
peut se contenir lui-même. Dans un tel cas, il faut, si le langage le permet, utiliser un
pointeur ou une référence.
2 Nous avons considéré ici une situation particulière : un objet de type A contient une référence à lui-même (et, de plus, il s’agit d’un attribut de classe). D’une manière générale, un objet a1 de type A pourrait très bien contenir une référence (de classe ou non) à
un autre objet a2 de type A. Ce serait le cas, par exemple, dans une « liste chaînée »
d’objets, dans laquelle chaque objet contiendrait la référence de l’objet suivant de la
liste. Là encore, ces situations poseront problème en cas de gestion par valeur : si a1,
a2 et a3 sont de type A, un objet a1 ne peut pas contenir un objet a2 qui, à sont tour,
contiendrait un objet a3...
Exercice 11.5 En s’inspirant de l’exemple précédent, écrire un canevas pour une classe nommée Doubleton, n’autorisant pas plus de deux instanciations. On utilisera également une
méthode créeInstance, dont les deux premiers appels fourniront un objet de type Doubleton. Les appels suivants fourniront à tour de rôle la référence au premier ou au second
objet.
Côté langages
Java, C# et PHP
Dans ces trois langages, les objets sont gérés par référence. La construction d’un objet composé doit réaliser explicitement les appels de tous les constructeurs nécessaires (comme nous l’avons fait dans nos
exemples).Tout se déroule comme dans ce que nous avons présenté dans ce chapitre.
C++
En C++, rappelons-le, les objets sont gérés par valeur. Pour la construction des objets composés, il existe
un mécanisme permettant d’appeler automatiquement les constructeurs des différents composants, en
précisant les paramètres voulus. Si un objet ne contient pas de pointeurs (références) vers d’autres objets,
la copie des objets mise en place automatiquement lors des affectations ou des transmissions de paramètres, est satisfaisante (elle correspond alors à une copie profonde, éventuellement récursive). En revanche,
si l’objet contient des pointeurs, le programme doit expliciter la façon dont il souhaite que cette copie se
déroule :
CHAPITRE 11
242
Remarques
1 Ce canevas ne serait pas utilisable dans un langage gérant les objets par valeur, puisque
alors un objet de classe Singleton contiendrait, non plus une référence vers un objet de
ce type, mais un objet (complet), ce qui, bien entendu, n’est pas possible : un objet ne
peut se contenir lui-même. Dans un tel cas, il faut, si le langage le permet, utiliser un
pointeur ou une référence.
2 Nous avons considéré ici une situation particulière : un objet de type A contient une référence à lui-même (et, de plus, il s’agit d’un attribut de classe). D’une manière générale, un objet a1 de type A pourrait très bien contenir une référence (de classe ou non) à
un autre objet a2 de type A. Ce serait le cas, par exemple, dans une « liste chaînée »
d’objets, dans laquelle chaque objet contiendrait la référence de l’objet suivant de la
liste. Là encore, ces situations poseront problème en cas de gestion par valeur : si a1,
a2 et a3 sont de type A, un objet a1 ne peut pas contenir un objet a2 qui, à sont tour,
contiendrait un objet a3...
Exercice 11.5 En s’inspirant de l’exemple précédent, écrire un canevas pour une classe nommée Doubleton, n’autorisant pas plus de deux instanciations. On utilisera également une
méthode créeInstance, dont les deux premiers appels fourniront un objet de type Doubleton. Les appels suivants fourniront à tour de rôle la référence au premier ou au second
objet.
Côté langages
Java, C# et PHP
Dans ces trois langages, les objets sont gérés par référence. La construction d’un objet composé doit réaliser explicitement les appels de tous les constructeurs nécessaires (comme nous l’avons fait dans nos
exemples).Tout se déroule comme dans ce que nous avons présenté dans ce chapitre.
C++
En C++, rappelons-le, les objets sont gérés par valeur. Pour la construction des objets composés, il existe
un mécanisme permettant d’appeler automatiquement les constructeurs des différents composants, en
précisant les paramètres voulus. Si un objet ne contient pas de pointeurs (références) vers d’autres objets,
la copie des objets mise en place automatiquement lors des affectations ou des transmissions de paramètres, est satisfaisante (elle correspond alors à une copie profonde, éventuellement récursive). En revanche,
si l’objet contient des pointeurs, le programme doit expliciter la façon dont il souhaite que cette copie se
déroule :
