Copy constructor?

BYellow Messages postés 1 Date d'inscription lundi 18 août 2003 Statut Membre Dernière intervention 18 août 2003 - 18 août 2003 à 06:31
cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 - 12 nov. 2003 à 23:11
Je suis pas sur de bien comprendre comment faire une des choses completement de base...copier une instance de classe, comme pour un "value type"

supposons:

class A { public int i = 5; }

{
A a1 = new A();
A a2 = a1; // ici, en fait, a2 est le meme objet que a1 :-(
A a3 = new A(a1); // ne compile pas sans constructeur de copie explicite
A a4 = a1.Duplicate(); // essai au hasard, ne marche bien sur pas. yatil une methode de Object qui cree une copie de l'object appelant?

}

Dois-je declarer un constructeur de copie a la main, pour une bete duplication qui serait le constructeur de copie par defaut en C++???

Merci de m'eclairer, tous les tutoriaux que j'ai epluche se contentent d'expliquer que "ah ben non, justement, on peut pas, c'est ca qui differencie les classes des structures"...

1 réponse

cs_vieuxLion Messages postés 455 Date d'inscription samedi 26 octobre 2002 Statut Membre Dernière intervention 6 avril 2004 8
12 nov. 2003 à 23:11
Salut BYellow

ton message est ancien
Il mérite quand même une réponse

En C# (contrairement au C++), il n'y a pas de Ctor de Copie
Comme tu l'as remarqué, deux comportements s'opposent :
- le passage par valeur pour les types de base et les structs
- le passage par référence pour les classes

S'il est possible de modifier le comportement des types de base en spécifiant le modificateur "ref",
il n'est pas directement possible de passer des objets par valeur !

Une solution est de "Cloner" l'objet avant et de passer la référence sur le clone.
C'est exactement ce qui est recommandé et le Framework fournit des moyens de se débrouiller :
une méthode "protected" MemberWiseClone qui permet à chaque objet se se copier lui-même
Attention tout de même car c'est une copie de surface :
les valeurs sont bien dupliquées mais les références aussi (et donc pas les objets référencés)
Pour compléter, il faut que chaque objet devant être cloné de l'extérieur fournisse une méthode "publique"
La recommandation est d'implémenter alors l'interface ICloneable (et sa méthode Clone)
... comme en java !

A+
0
Rejoignez-nous