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 :

[Language]Clonage d'un object etendu


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 65
    Par défaut [Language]Clonage d'un object etendu
    Salut, j'aimerai savoir si quelqun a déjà cloné un objet etendu? Moi j'ai essayé mais je rencontre java.lang.ClassCastException. Je m'explique en code
    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
     
    /* Voici une classe A*/
    public Class A{
    private int nb=0;
    public A(){}
    public getNb(){ return this.nb;}
    public setNb(int newNb){this.nb=newNb;}
    public Object clone(){
        A a= new A();
        a.setNb(this.getNb());
        return (a);}
    }
    /*Voici une classe B*/
    public Class B extends A{
    public B(){super();}
    public getNb(){return super.getNb();}
    public setNb(int newNb){super.nb=newNb;}
    public Object clone(){ return super.clone();}
     
    }
    /* Voici ce que je veux faire */
    A aa= new A();
    aa.setNb(45);
    B bb=(B)aa.clone();
    /* et c'est la derniere instruction qui declenche l'exception.*/
    Si quelqun a un coup de cerveau, c'est la bienvenue.

  2. #2
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    A est la super classe de B, donc ces instructions sont correctes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A ab = new B();
     
    B b = new B();
    A a = b;
    Par contre l'inverse est impossible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B ab = new A(); //erreur
     
    A a = new A();
    B b = (B)a;//erreur
    Fais l'analogie avec une classe Animal (A) et une classe Chien (B) qui hérite d'Animal.
    Un Chien est un Animal (Animal a = new Chien(); ) mais rien ne garantit qu'un Animal est un Chien (Chien c = new Animal(); //erreur).

    Par contre, ce code peut marcher (à toi de deviner pourquoi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Animal animal = new Chien();
    Chien chien = (Chien)animal;
    Si tu corriges ton code en utilisant le code suivant, ca devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A aa= new B();
    aa.setNb(45);
    B bb=(B)aa.clone();

  3. #3
    Membre confirmé Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Par défaut

    d'abord j'ai une remarque:
    cette ligne est inutile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Object clone(){ return super.clone();}
    il est inutile de redéfinir une methode si elle ne fait rien en plus de celle définit dans la classe mère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B bb=(B)aa.clone();
    c'est normal que ça ne marche pas car un objet de la classe A n'est pas un objet de la classe B.

    j'ai l'impression que t'as mal compris le cast.
    le cast sert à obtenir le contenu "réel" d'un objet "caché" par un autre
    par exemple si tu fais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    A aa= new B(); 
    aa.setNb(45); 
    B bb=(B)aa.clone();
    dans ce cas ça va marcher...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Par défaut
    Citation Envoyé par dlemoing
    Si tu corriges ton code en utilisant le code suivant, ca devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A aa= new B();
    aa.setNb(45);
    B bb=(B)aa.clone();
    Pas tout a fait puisque aa.clone() renvoie un objet de type A.
    Il faudrait plutot faire ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A aa= new B();
    aa.setNb(45);
    B bb=((B)aa).clone();
    Et encore ce n'est meme pas sur que ca marchera a cause de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Object clone(){ return super.clone();}
    qui renvoie également un objet de type A.
    Il faudrait que tu redefinisse la méthode clone de la classe B.

  5. #5
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 65
    Par défaut
    Merci les gars. C'est propre. Merci

  6. #6
    Membre confirmé Avatar de soulhouf
    Inscrit en
    Août 2005
    Messages
    213
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 213
    Par défaut
    tu peux utiliser la commande instanceof pour être sûr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("bb est une instance de A: " + (bb instanceof A));
    tu vas obtenir: bb est une instance de A: false

  7. #7
    Membre chevronné
    Inscrit en
    Août 2005
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 352
    Par défaut
    Citation Envoyé par barbu0055
    Citation Envoyé par dlemoing
    Si tu corriges ton code en utilisant le code suivant, ca devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A aa= new B();
    aa.setNb(45);
    B bb=(B)aa.clone();
    Pas tout a fait puisque aa.clone() renvoie un objet de type A.
    Autant pour moi, je l'avais pas vu celle la.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public Object clone() {
        A a= (A)this.getClass().newInstance();
        a.setNb(this.getNb());
        return (a);
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/06/2014, 19h25
  2. Object Query Language-OQL et Oracle ?
    Par fred19 dans le forum Oracle
    Réponses: 0
    Dernier message: 07/11/2010, 15h19
  3. OCL(OBJECT CONSTRAINT LANGUAGE)
    Par souma86.ss dans le forum UML
    Réponses: 3
    Dernier message: 19/11/2007, 11h26
  4. [Language]Cast de int en Object ?
    Par BouB dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2005, 17h41
  5. je veux apprendre la programmation quel language choisir??
    Par existance dans le forum Débuter
    Réponses: 26
    Dernier message: 06/08/2002, 05h32

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