IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Méthode clone() dans des classes qui s'étendent


Sujet :

Langage Java

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut Méthode clone() dans des classes qui s'étendent
    Bonjour,

    J'ai essayé de créer deux classes dont la ClasseB qui étend la ClasseA. Et toutes les deux ont une méthode clone().

    Cependant lorsque je fais appel au clone de la ClasseB qui fait lui même référence à la méthode clone de la ClasseA, ça plante ...

    Je me doute que j'ai mal programmé, mais je ne vois pas comment faire autrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class Test
    {
    	public static void main(String[] args)
    	{
    		ClasseB chaine = new ClasseB();
    		try
    		{
    			chaine = (ClasseB) chaine.clone();
    			System.out.println(chaine.getChaineB());
    		}
    		catch (CloneNotSupportedException e)
    		{
    			e.printStackTrace();
    		}
    	}
    }
     
    class ClasseA implements Cloneable
    {
    	private String chaineA;
     
    	public ClasseA()
    	{
    		this.chaineA = "A";
    	}
     
    	public void setChaineA(String chaine)
    	{
    		this.chaineA = chaine;
    	}
     
    	public String getChaineA()
    	{
    		return this.chaineA;
    	}
     
    	public Object clone() throws CloneNotSupportedException
    	{
    		ClasseA temp = (ClasseA) super.clone();
    		temp.setChaineA(this.chaineA);
     
    		return temp;
    	}
    }
     
    class ClasseB
    {
    	private String chaineB;
     
    	public ClasseB()
    	{
    		chaineB = "B";
    	}
     
    	public void setChaineB(String chaine)
    	{
    		this.chaineB = chaine;
    	}
     
    	public String getChaineB()
    	{
    		return this.chaineB;
    	}
     
    	public Object clone() throws CloneNotSupportedException
    	{
    		ClasseB temp = (ClasseB) super.clone();
    		temp.setChaineB(this.chaineB);
     
    		return temp;
    	}
    }
    D'avance merci pour votre aide.



    xenos

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par xenos Voir le message
    la ClasseB qui étend la ClasseA.
    Ce n'est pas le cas dans ton code :
    Du coup la ClasseB n'est pas Cloneable...


    Au passage tu n'a pas besoin d'affecter explicitement les variables, sauf si tu as besoin d'en faire une copie.


    a++

  3. #3
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour ton aide adiGuba.

    Bon finalement c'était un simple oublie. En ajoutant "extends ClasseA" ça fonctionne.

    Bonne journée.

  4. #4
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    bonjour,
    j'ai un problème d'utilisation de la méthode clone .
    je veux travailler sur une copie d'un vecteur d'attribut " res1 " (res c'est la copie originale ) car je ne veux pas modifie la copie original , mais cela ne marche pas et toujours la copie original a changé .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // l'interface
    public interface cloneable {
    Object clone();
    }
    la méthode clone qui se trouve dans ma classe qui implémente l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Object clone() {
    Object o = null;
    try {
    // On récupère l'instance à renvoyer par l'appel de la 
    // méthode super.clone()
    o = super.clone();
    } catch(CloneNotSupportedException cnse) {
    // Ne devrait jamais arriver car nous implémentons 
    // l'interface Cloneable
    cnse.printStackTrace(System.err);
    }
    // la copie res1 de res
    Vector<Regle> res1=(Vector<Regle>) res.clone();
    ....
    si vous pouvez m'aider pour résoudre ce problème;
    merci à tous
    je ne sais pas pourquoi la copie original "res" change lors de l'exécution

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Deux questions :

    - C'est quoi le code complet de clone(), des éléments de la classe qui y interviennent, et un exemple court de son utilisation ?
    Autrement dit, fais-nous un programme très court mais qu'on peut lancer, et qui illustre ton problème. (Et désormais fais-le toujours, chaque fois que tu as une question informatique.)

    - C'est quoi qui "change" au juste, d'un objet à l'autre ? Comment tu sais qu'un changement sur l'un est reporté à l'autre ?

  6. #6
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    bonjour
    res est un vecteur qui contient un ensemble des règles de type a,d,r..->b
    je veut faire un croisement entre 2 règles successive . la méthode "glouton " construit les règles et les ajouter à la fin de res si cette règle a trouve dans notre fichier excel. glouton peut retourner null c'est à dire aucune règle trouver. lors de l'exécution les règles principale dans "res" a changé : par exemple une règles a1,a2,a3,4a--> classe va changé au a1,a2-->classe ! c'est à dire quand je divise la règle en 2 pour faire un croisement ,je travail sur la copie originale.
    voila une partie de code où je trouve le problème code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     int t=0;
    	int g=res.size()-2;	
    	Vector<Regle> res1=(Vector<Regle>) res.clone();
    		while ((t <=g) )
    		{	
    			System.out.println("Boucle 2 parcours numero "+(t+1));
    			 pathInit=new Vector<Attribut>();
    			 Vector<Attribut> moit1=new Vector<Attribut>();
    			 Vector<Attribut> moit2=new Vector<Attribut>();
     
    //construire graine par croisement  de deux moitiés de règles pour former une nouvelle graine
     
    Regle premisse=(Regle) res1.elementAt(t);
     
    Vector<Attribut> nouvellepremisse1=premisse.tete;
    int milieu =nouvellepremisse1.size()/2;
    System.out.print ("milieu"+milieu+" ");
    System.out.print(" premisse1"+nouvellepremisse1+" ");
    for (int k=nouvellepremisse1.size();k>milieu;k--)
    {
    								   							  moit1.addElement(nouvellepremisse1.elementAt(nouvellepremisse1.size()-1));
    								   nouvellepremisse1.removeElementAt(nouvellepremisse1.size()-1);		               
    }
     
    System.out.print("partie de la premisse1"+nouvellepremisse1+" ");
     
    Regle premisse2=(Regle) res1.elementAt(t+1);
     
    Vector<Attribut> nouvellepremisse2=premisse2.tete;
     milieu =nouvellepremisse2.size()/2;
    System.out.print ("milieu"+milieu+" ");
    for (int k=nouvellepremisse2.size();k>milieu;k--)
    {					      moit2.addElement(nouvellepremisse2.elementAt(nouvellepremisse2.size()-1));
    							nouvellepremisse2.removeElementAt(nouvellepremisse2.size()-1);
    }
     
    System.out.print("partie de la premisse2"+nouvellepremisse2+" ");
     
     //Concaténer les deux parties de prémisses
    pathInit.addAll(nouvellepremisse1);
    pathInit.addAll(nouvellepremisse2);
    System.out.print(pathInit);
     pathInit=new java.util.Vector<Attribut>(new java.util.HashSet<Attribut>(pathInit));
      System.out.println("Après filtre 1: "+pathInit);
      System.out.println("choix aleatoire1 "+pathInit.size()+" "+pathInit);
    Regle regleRes=glouton(pathInit,gb,gbNeg,gbNegAtt,qui,valuateurC,res);
     // Retourne null si aucun resultat
    System.out.println("Resultat\n"+regleRes+" taille classifieur "+res.size());
     
    pathInit.removeAll(pathInit);
    pathInit.addAll(moit1);
     pathInit.addAll(moit2);
     System.out.print(pathInit);
    pathInit=new java.util.Vector<Attribut>(new java.util.HashSet<Attribut>(pathInit));
     System.out.println("Après filtre2 : "+pathInit);
     
    System.out.println("choix aleatoire2 "+pathInit.size()+" "+pathInit);
     regleRes=	glouton(pathInit,gb,gbNeg,gbNegAtt,qui,valuateurC,res); // Retourne null si aucun resultat
     
    		                    }		   
    		               	t=t+2;
     
    			 }
     
    	}
    merci pour votre aide

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 996
    Points
    7 996
    Par défaut
    Citation Envoyé par thelvin Voir le message
    - C'est quoi qui "change" au juste, d'un objet à l'autre ? Comment tu sais qu'un changement sur l'un est reporté à l'autre ?
    Parce qu'il a cloné le vecteur, au lieu de creer un nouveau, et d'avec une boucle recloner les "enfants" du vecteur ?

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    bonjour ;
    je suis débutante et c'est la première fois qu'on faire un programme java.
    s'il vous plait donne moi un exemple de code pour corriger mon problème
    merci à tous

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 996
    Points
    7 996
    Par défaut
    Si j'ai bien tout compris voici un exemple qui clone aussi les fils dans la liste afin de ne pas avoir 2 listes qui auront en fait les même references vers les enfants, mais bien 2 liste avec chacune ses propres enfants (clonés)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public Object clone()
    	{
    		Object o = null;
    		try
    		{
    			o = super.clone();
    			(((LOADCASES) o).LOADCASES) = new ArrayList<LoadCase>();
    			for (int i = 0; i < this.LOADCASES.size(); i++)
    				((LOADCASES) o).LOADCASES.add((LoadCase)this.LOADCASES.get(i).clone());
    		}
    		catch (CloneNotSupportedException cnse)
    		{
    			cnse.printStackTrace(System.err);
    		}
    		return o;
    	}
    LOADCASE sera a remplacer par Regle si je ne m'abuse....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#]Remonter des événements dans des classes imbriquées
    Par Kcirtap dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/12/2013, 12h43
  2. Réponses: 1
    Dernier message: 20/09/2013, 12h29
  3. Réponses: 2
    Dernier message: 08/12/2008, 18h20
  4. Des classes qui discutent...
    Par comme de bien entendu dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2006, 17h45
  5. [WSDL][Axis] Récupération de valeur dans des classes java
    Par cosmos38240 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 09/01/2006, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo