Problème avec clone !!!

Problème avec clone !!! - Java - Programmation

Marsh Posté le 19-04-2005 à 16:47:53    

Bonjour!  
J'ai fait une petite appli dans laquelle je doit utiliser la méthode clone. Mes classes implementes donc l'interface cloneable et redifinisse la méthode protected Object clone() en public Ojbect clone().
Dans public Object clone je recopie tous les attributs ou classes dans un nouvel object de la facon suivante :

Code :
  1. class c{ ...
  2. public Object clone(){
  3. Copie c= (Copie) super.clone();
  4. c.attribut1 = (Attribut1) attribut1.clone(); // On recopie un type de base
  5. c.classe1 = (Class1) classe1.clone(); // On recopie une classe
  6. ...
  7. return c;
  8. }
  9. ...}


et ca ne marche pas  :pt1cable: ... Pouvez-vous m'aider. Ou alors y'a t-il une autre solution (plus propre) pour copier des objets ? Merci


Message édité par rital_5_4 le 19-04-2005 à 16:48:52
Reply

Marsh Posté le 19-04-2005 à 16:47:53   

Reply

Marsh Posté le 19-04-2005 à 17:42:49    

Que veut dire "ça ne marche pas" ? :o

Reply

Marsh Posté le 19-04-2005 à 18:24:27    

l'object n'est pas recopier ailleurs en mémoire et la référence reste la même (ie sur l'object dont on fait la copie)

Reply

Marsh Posté le 19-04-2005 à 18:32:34    

n'est pas recopier é
je doit s
Mes classes implementes nt
 [:moundir]
 
B*rd*l, les gens ne savent vraiment plus écrire ?! Niveau école primaire !!!! Avant de coder un clone(), quoi, c'est trop demander ? :o
 
Essaye avec disons un attribut "simple" (genre String) et un de ton propre cru, pour simplifier. Ensuite, poste ton code simplifié si ça ne va pas mieux.
 
 
 

Reply

Marsh Posté le 19-04-2005 à 18:44:11    

sircam a écrit :

n'est pas recopier é
je doit s
Mes classes implementes nt
 [:moundir]
 
B*rd*l, les gens ne savent vraiment plus écrire ?! Niveau école primaire !!!! Avant de coder un clone(), quoi, c'est trop demander ? :o
 
Essaye avec disons un attribut "simple" (genre String) et un de ton propre cru, pour simplifier. Ensuite, poste ton code simplifié si ça ne va pas mieux.


 
Avant une solution "propre", ecrire proprement c'est cool aussi... Bref, tu peux utiliser un constructeur par copie, ca evite la surcharge des classes avec clonable

Reply

Marsh Posté le 19-04-2005 à 21:21:38    

ca marche avec les classes que j'ai créé mais avec les vecteurs impossible de faire du clonage ...

Reply

Marsh Posté le 19-04-2005 à 21:31:07    

Essaye d'accorder la méthode "créé" avec les "classes".
 
"Impossible de faire du clonage" -> pour la 2è fois, pourrais-tu être un peu plus précis et ne pas te limiter à l'équivalent de "ça ne marche pas" ?
 
Ce lien devrait sans doute t'aider.

Reply

Marsh Posté le 19-04-2005 à 21:42:41    

Alors, comme je l'ai dis plus haut mon code ressemble à ca :

Code :
  1. class C{ ...
  2. private Classe1 classe1;
  3. private Attribut1 attribut1;
  4. private Vector liste;
  5. public Object clone(){
  6. Copie c= (Copie) super.clone();
  7. c.attribut1 = (Attribut1) attribut1.clone(); // On recopie une classe
  8. c.classe1 = (Class1) classe1.clone(); // On recopie une classe  
  9. ...
  10. c.liste = (Vector) liste.clone(); // <<< Problème ici vraisemblablement
  11. ...
  12. return c;
  13. }
  14. ...}


Ensuite je fais C maclasse1 = new C(); puis C maclasse2 = maclasse1.clone();
 
Or ensuite lorsque je regarde les reférences des objets clonés :
Les objets maclasse2, maclasse2.attributs1 et maclasse2.classe1 ont des références différentes de l'objet de départ
Et maclasse2.liste garde la même référence que maclasse1.liste ...
 
J'ai essayé d'être plus clair...


Message édité par rital_5_4 le 19-04-2005 à 21:45:46
Reply

Marsh Posté le 06-05-2005 à 10:00:20    

La méthode clone() renvoie une copie d'un objet mais pas de tous les objets qui la constituent...
Si tu as une classe toto du style
 
public class toto{
Object titi;
Object tutu;
 
 
et que tu fais macopie=montoto.clone();
macopie dispose d'un titi a lui et d'un tutu a lui mais qui pointe physiqement sur ceux de montoto
Si tu modifies montoto.titi il va changer celui de ma copie.titi ....
quand tu redefinis la méthode clone() dans ta classe, tu dois aussi cloner les attributs de la classe
 
du style
 
public toto clone(){
toto macopie=new toto();
macopie=this.clone();
macopie.settiti(this.titi.clone());
....
return macopie;
}


Message édité par balinette le 06-05-2005 à 10:00:39
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed