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

Java Discussion :

Caster suivant classe variable


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut Caster suivant classe variable
    Bonjour,

    J'ai une liste d'objets de types différents.

    J'aimerais récolter certaines de leurs infos mais pour cela, j'ai besoin de caster dans le bon type à chaque fois ;:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class castClass = obj.getClass();
    mais après?

    Ce genre de chose ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    castClass el = (castClass )(obj)
    castClass.getName() el = (castClass.getName())(obj)

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Par défaut
    tu ne peux pas, le type dans le typecasting (entre les parenthèse) doit être connu à la compilation. Dans ton cas il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (obj instanceOf ClassA)
      uneMethode((ClassA)obj);
    else if (obj instanceOf ClassB)
      uneMethode((ClassB)obj);
    Evidement le mieux serait soit de déjà avoir le bon type pour obj afin d'éviter une casting, soit d'avoir 'uneMthode' qui prendre directement un ClasseMere

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    J'ai un peu modifié la demande.

    Mais c'est horrible, j'ai potentiellement 10 classes et ça me fait faire quelque chose d'assez lourd (et pas bon à maintenir...)

  4. #4
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Question bête : uneMethode n'est pas déplaçable dans les classes A, B, etc ?
    Parce qu'une méthode qui dépend du type de l'objet à l'exécution, typiquement ça se case dans l'objet lui même
    Cela dit, il arrive souvent qu'on soit un peu coincés, comme quand il y a 2 types d'objets mouvants. Si on peut suffisamment séparer les traitements, ça passe, sinon, bonjour le instanceof !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Par défaut
    oui, ben dans ce cas faut revoir ton design Comme je l'ai dit, revoir le code pour qu'il puisse utiliser la classe mère. Si c'est la même méthode avec 10 classes différentes, on peut supposer que ces classes ont suffisament en commun que pour soit travailler avec la classe mère, soit travailler avec une itnerface commune aux 10 classes concernées.

    j'avais déjà vu ce genre de code dans une librairie, ils faisaient ainsi, c'était affreux mais c'était leur solution:

    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 int uneMethode(ClassA classA) {....}
    public int uneMethode(ClassB classB) {....}
    //.....
    public int uneMethode(ClassN classN) {....}
    public int uneMethode(Object o) {
    if (o instanceOf ClassA)
       return uneMethode((ClassA)o);
    if (o instanceOf ClassB)
       return uneMethode((ClassB)o);
    //.....
    if (o instanceOf ClassN)
       return uneMethode((ClassN)o);
    }

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Par défaut
    Bon, OK; c'est vrai que la conception est un peu bizarre des fois mais je ne suis pas là pour tout casser

    En fait je m'en suis sorti par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.getClass().getMethod("uneMethode").invoke(obj)
    entouré d'un try catch (20 minutes pour comprendre pourquoi le compilateur ne voulait pas, ça donne le niveau...)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 54
    Par défaut
    attention que ce code
    -> ne survivra pas à un refactoring
    -> ne marchera plus si un jour on remplace uneMéthode(ClassA) par une Méthode(ClassMere)
    -> que ca appelle 'uneMéthode' sur l'objet et non pas appeler uneMéthode en lui passant le'objet mentionné, comme je l'avais compris dans ton post Initial.

    En effet, finalement, ton code est l'équivalent de faire


    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 ClassA extends ClassMere{
      public void uneMéthode(){....}
    }
    public ClassB extends ClassMere{
      public void uneMéthode(){....}
    }
    public ClassMere {
       public abstract void uneMethode();
    }
     
     
    ... 
    ClassMere cm = ...;
    cm.uneMéthode();

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

Discussions similaires

  1. [CR8.5]Masquer une section détail suivant une variable partagée
    Par ryllin dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 04/10/2007, 10h00
  2. [POO] Problème de classe : Variables empty ?
    Par Steph_SOUMIER dans le forum Langage
    Réponses: 8
    Dernier message: 30/01/2007, 11h52
  3. probleme pour faire gotoandplay suivant une variable
    Par logone dans le forum ActionScript 1 & ActionScript 2
    Réponses: 26
    Dernier message: 09/05/2006, 10h18
  4. Réponses: 2
    Dernier message: 06/03/2006, 11h22
  5. Réponses: 13
    Dernier message: 15/11/2005, 15h47

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