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 :

changer l'instance d'un objet


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 220
    Par défaut changer l'instance d'un objet
    Imaginons que (ObjetA instanceof C == true) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Class A {
         A gauche;
         A droite;
         public void simplifier() {
              if ( gauche instanceof B && droite instanceof B)
    //               j'aimerais changer l'instance en B par exemple
         }
    }
     
    Class B extends A {}
    Class C extends A {}
    Class D extends A {}

  2. #2
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
         public void simplifier() {
              if ( gauche instanceof B && droite instanceof B) {
    //               j'aimerais changer l'instance en B par exemple
                     B gaucheB = (B) gauche;
                     B droiteB = (B) droite;
                     // code utilisant ces instances...
              }
         }
    Par contre tu ne pourras pas modifier les variables d'instance elles-même.

    En Java5 et + c'est possible en utilisant les génériques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class A<T extends A> {
         T gauche;
         T droite;
    }
     
    Class B extends A<B> {}
    Class C extends A<C> {}
    Class D extends A<D> {}
    Tu pourras faire ça directement sans caster ni tester les types :


  3. #3
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Tu ne peux pas changer le type d'un objet une fois celui-ci construit.
    Tu pourrais utiliser un attribut qui contiendrait le type de l'objet :
    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
    Class A {
         A gauche;
         A droite;
         Type type = Type.TypeA;
     
         public void simplifier() {
              if ( gauche.getType() == TypeB && droite.getType() == TypeB)
                setType(TypeB);
         }
     
         public Type getType() {
           return type;
         }
     
         public setType(Type type) {
           this.type = type;
         }
    }
     
    enum Type { TypeA, TypeB, TypeC, TypeD;
     // méthodes...
    };
     
    Class B extends A {}
    Class C extends A {}
    Class D extends A {}

  4. #4
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par herve91 Voir le message
    Tu ne peux pas changer le type d'un objet une fois celui-ci construit.
    Tu pourrais utiliser un attribut qui contiendrait le type de l'objet :
    Ca s'est dangereux car on peut quand même affecter un type A même si on type Type.B
    Ou alors il faut des getters/setters qui incluent des contrôles.

    Les génériques ou des instanceof dans ce genre de cas, c'est quand même le plus clair.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Par défaut
    on peut utiliser un design pattern state pour gerer le changement d'etat (ici l'etat c'est le "type")

    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
     
    class Node{
      A moi
      Node gauche;
      Node droite;
     
      void simplifier(){
        if(gauche.moi instanceof B && droite.moi instanceof B){
          moi=new B();
        }
      }
    }
     
    class A{
     traitement(){...}
    }
     
    class B extends A{
      traitement(){...}
    }

Discussions similaires

  1. [PHP 5.2] [POO] Changer la classe d'un objet déjà instancié
    Par fourchette dans le forum Langage
    Réponses: 5
    Dernier message: 06/08/2009, 14h46
  2. [POO] Changer la source d'un objet (flash) en Javascript
    Par thomine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/02/2008, 16h54
  3. Réponses: 1
    Dernier message: 20/02/2006, 10h59
  4. Sauver l'instance d'un objet dans un TMemoryStream
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 11/09/2005, 09h23
  5. changer la couleur d'un objet existant
    Par Mandalar dans le forum Tkinter
    Réponses: 4
    Dernier message: 02/03/2005, 21h09

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