Clonage

Clonage - Java - Programmation

Marsh Posté le 08-07-2002 à 14:42:28    

salut
 
j'ai un pbm lorsque je veux cloner en profondeur (clones les agregats):
 
le super.clone(); marche bien mais les .clone() qui doivent suivre (un pour chaque membre de ma classe) ne marche pas ... ca me sort "clone() has protected access in java.lang.Object" et je comprend pas pkoi.
 
Voici le squellette de ma classe (en simplifier):
 

Code :
  1. public class logs implements Cloneable
  2. {
  3. private String logsDate;
  4. private String logsMsgType;
  5.    
  6.        //Clonage en profondeur
  7. public Object clone() throws CloneNotSupportedException
  8. {
  9.  logs logsClone = (logs)super.clone();
  10.  logsClone.logsDate = (String)logsDate.clone(); // Clone l'agrégat -> erreur
  11.  logsClone.logsMsgType = (String)logsMsgType.clone(); //erreur aussi ici
  12.  return logsClone;
  13. }
  14. ...
  15. }

Reply

Marsh Posté le 08-07-2002 à 14:42:28   

Reply

Marsh Posté le 08-07-2002 à 14:58:08    

bin ca veut dire ce que ca veut dire. clone() est protected ce qui signifie que tu ne peux l'overrider que si tu étends Objetc ou un de ces sous objets :)
 
Or là tu lui donne un accès public ce qui est faut. Le code suivant devrait marcher mieux
 
 

Code :
  1. public class logs implements Cloneable
  2.   {
  3.      private String logsDate;
  4.      private String logsMsgType;
  5.        
  6.           //Clonage en profondeur
  7.      protected Object clone() throws CloneNotSupportedException
  8.      {
  9.         logs logsClone = (logs)super.clone();
  10.        
  11.         logsClone.logsDate = (String)logsDate.clone();// Clone l'agrégat -> erreur
  12.         logsClone.logsMsgType = (String)logsMsgType.clone();//erreur aussi ici
  13.         return logsClone;
  14.      
  15.      }
  16.    
  17.     ...
  18.   }


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 15:15:36    

euh, j'ai tjs la meme erreur  :(  
 
Et en plus si je met "protected" comment pourrais-je me servir de cette methode (mon .clone() a moi) en dehors de cette classe (ce que je veux faire) ???
 
Pis tous les exemples que j'ai trouv'e ils mettent public (genre la: http://deptinfo.unice.fr/~grin/mes [...] entsTA.pdf )
 
Enfin, merci qd meme...  :jap:

Reply

Marsh Posté le 08-07-2002 à 15:20:10    

Tamahome a écrit a écrit :

Pis tous les exemples que j'ai trouv'e ils mettent public (genre la: http://deptinfo.unice.fr/~grin/mes [...] entsTA.pdf )




 
Dis une question tu sais lire ?
 

Citation :


Cette méthode de la classe Object permet le clonage de l?objet courant ; son profil est
 
protected Object clone()
throws CloneNotSupportedException
 
Elle est protected. On ne peut donc l?utiliser sans créer une sous -classe qui redéfinit clone() (car les nouvelles classes que l?on écrit ne sont pas dans le même paquetage que Object)
Elle effectue un clonage de surface
 


 
Je suis désolé je vois pas de public là dedans ... :sarcastic:


Message édité par darklord le 08-07-2002 à 15:21:26

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 15:27:03    

Tamahome a écrit a écrit :

Et en plus si je met "protected" comment pourrais-je me servir de cette methode (mon .clone() a moi) en dehors de cette classe (ce que je veux faire) ???




 
bin si tu définis clone() dans ta classe tu pourras l'appeller sur ton instance. C'est le but de clone d'ailleurs ... Cloner l'instance sur laquelle tu l'appelles :)
 
Et puis en ce qui concerne les droits tu peux appeller cette méthode si tu hérites de java.lang.Object. Or tout objet Java étend de java.lang.Object directement ou indirectement ...
 
Tu ne confondrais pas méthode protégée et classe protégée ???


Message édité par darklord le 08-07-2002 à 15:35:21

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 16:03:51    

DarkLord a écrit a écrit :

 
 
bin si tu définis clone() dans ta classe tu pourras l'appeller sur ton instance. C'est le but de clone d'ailleurs ... Cloner l'instance sur laquelle tu l'appelles :)
 
Et puis en ce qui concerne les droits tu peux appeller cette méthode si tu hérites de java.lang.Object. Or tout objet Java étend de java.lang.Object directement ou indirectement ...
 
Tu ne confondrais pas méthode protégée et classe protégée ???




 
ah si, merci pour cette info :)

Reply

Marsh Posté le 08-07-2002 à 16:05:45    

DarkLord a écrit a écrit :

 
 
Dis une question tu sais lire ?
 

Citation :


Cette méthode de la classe Object permet le clonage de l?objet courant ; son profil est
 
protected Object clone()
throws CloneNotSupportedException
 
Elle est protected. On ne peut donc l?utiliser sans créer une sous -classe qui redéfinit clone() (car les nouvelles classes que l?on écrit ne sont pas dans le même paquetage que Object)
Elle effectue un clonage de surface
 


 
Je suis désolé je vois pas de public là dedans ... :sarcastic:




 
Regarde plutot l'exemple sur le clonage en profondeur...c'est du public pour eux...
 
Le surface je suis dáccord ca marche qussi chez moi. MAis moi c'est le clonoge en profondeur qui m'interresse... [:totoz]

Reply

Marsh Posté le 08-07-2002 à 16:12:18    

ok bin ca vient simplement du fait, il me semble que tu veux cloner en profondeur mais ton objet là il hérite d'Objet directement.
 
Donc en faisant ca
 

Code :
  1. logs logsClone = (logs)super.clone();


 
c'est ca le problème. Si tu regarde bien l'exemple du lien c'est pas ca qu'il fait ... Ceci dit c'est vrai que c'est étrange ce truc .... mmm


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 16:26:31    

DarkLord a écrit a écrit :

ok bin ca vient simplement du fait, il me semble que tu veux cloner en profondeur mais ton objet là il hérite d'Objet directement.
 
Donc en faisant ca
 

Code :
  1. logs logsClone = (logs)super.clone();


 
c'est ca le problème. Si tu regarde bien l'exemple du lien c'est pas ca qu'il fait ... Ceci dit c'est vrai que c'est étrange ce truc .... mmm  




 
Yep je comprend pas trop... Et dans un autre site il explique peu ou prou la meme chose:
 

  • cloner l'objet en lui meme (le conteneur en fait)
  • Puis cloner tous les membres de l'objet


Enfin c'est ce que j'ai compris.
 
L'objet se clone, mais pas les membres...

Reply

Marsh Posté le 08-07-2002 à 16:29:49    

bin si tu as un objet qui hérite d'objet et qui contient deux membres tu dois
 
faire un super.clone() pour cloner les parties qui proviennet de la classe parente
 
cloner le membre 1
cloner le membre 2.
 
Enfin a priori c'est ce que je ferais ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-07-2002 à 16:29:49   

Reply

Marsh Posté le 08-07-2002 à 16:38:31    

DarkLord a écrit a écrit :

bin si tu as un objet qui hérite d'objet et qui contient deux membres tu dois
 
faire un super.clone() pour cloner les parties qui proviennet de la classe parente
 
cloner le membre 1
cloner le membre 2.
 
Enfin a priori c'est ce que je ferais ...




 
c exact

Reply

Marsh Posté le 09-07-2002 à 08:30:14    

HappyHarry a écrit a écrit :

 
 
c exact




 
c bien ce ke j'avais compris, mais ca marche pas...doit y avoir une erreur de syntaxe toute conne qui me passe sous le nez comme un gros n00b... :cry:

Reply

Marsh Posté le 09-07-2002 à 08:40:39    

Ben, les membres, leur méthode clone() est protégée, puisqu'elle est fatalement une redéfinition de la méthode clone() de java.lang.Object, non??
 
Donc, si tu veux pouvoir l'appeller, il faut le faire depuis une classe qui appartient au MEME PACKAGE que la classe!
 
Donc, par exemple, tu ne peux pas appeller toto.clone() si toto est une String, à moins que tu ne le fasses depuis une classe de java.lang
 
 
Donc voilà.

Reply

Marsh Posté le 09-07-2002 à 10:00:17    

gfive a écrit a écrit :

Ben, les membres, leur méthode clone() est protégée, puisqu'elle est fatalement une redéfinition de la méthode clone() de java.lang.Object, non??
 
Donc, si tu veux pouvoir l'appeller, il faut le faire depuis une classe qui appartient au MEME PACKAGE que la classe!
 
Donc, par exemple, tu ne peux pas appeller toto.clone() si toto est une String, à moins que tu ne le fasses depuis une classe de java.lang
 
 
Donc voilà.




 
mais enfin .... Comment tu fais pour cloner un objet alors ?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 09-07-2002 à 10:33:24    

rhaaaaaaaaaa je comprend rien :pt1cable:

Reply

Marsh Posté le 09-07-2002 à 11:30:08    

Dark : ah, ça, je sais pas!! :D:D Mais pas en appellant clone() en dehors de son package, en tout cas, ça, c'est sûr : essaie, tu verra : tu te fais une classe Test avec un attribut String, et tu essaies de lui écrire une méthode clone()..qui appelle clone() sur la String, ben le compilateur va te jeter!!
 
Alors le mieux...C'est de pas utiliser clone()!!  
Tu te crées un constructeur  
 
public Toto(Toto toto) {
}
 
Ou alors, si tu veux un truc plus dynamique, tu te crées une méthode copy(), par exemple...Mais bon,; protected, ça limite l'accès aux classes du package, point barre....dans cette optique, effectivement, clone() est inutilisable...A voir dans les forums de sun, ou de JGuru, non??
 
et dedans, tu fais les copies qui vont bien...
Je sais, c'est lourd,

Reply

Marsh Posté le 09-07-2002 à 11:49:26    

mais où est l'intéret de clone alors non didjo ...


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 09-07-2002 à 12:03:57    

Ben, justement, j'écrivais qaue je me le demandais, et qu'il faudrait aller voir sur jGuru ou un truc comme ça, quand j'ai fourbeusement rippé sur tab, puis sur entrée!!
Et comme je m'en suis pas aperçu tout de suite, ben ouala, quoi!

Reply

Sujets relatifs:

Leave a Replay

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