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 :

Polymorphisme et objets stockés dans un vector


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 48
    Points
    48
    Par défaut Polymorphisme et objets stockés dans un vector
    Bonjour, j'ai différentes formes que l'utilisateur a dessiné dans mon appli.
    J'essaye de mettre en oeuvre le polymorphisme en créant une classe ObjDraw :
    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
     
     
    class ObjDraw 
    {
      int typeobj; 
      Polygon polyobj;
      String label;
     
      public ObjDraw (int typeobj, Polygon polyobj, String label)
      {
          .....
      }
     
      draw(Graphics g, int tx, int ty, double echelle, int[] cadre)
      {
        .....
      }
    }
    et des classes ObjDrawRect et ObjDrawCercle qui en heritent mais avec des attributs en plus *> ex :
    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
    
    class ObjDrawRect extends ObjDraw 
    {
      public ObjDrawRect(int typeobj, Polygon polyobj, String label)
      {
         super(typeobj, polyobj, label);
          .....
      }
    
      draw(Graphics g, int tx, int ty, double echelle, int[] cadre)
      {
        super(g, tx, ty, echelle,  cadre);
        SystemOut.println("draw rectangle"');
        code spécifique au rectangle
        .....
      }
    }

    Je stocke mes objets dans un Vector mais quand je parcours mon vector et que je cast mon Objets selon typeobj en ObjDrawRect et que j'appel la methode draw et bien seul le code de ObjDraw est appelé.

    Avez vous une idée car sinon je vais être oblige de laisser tomber le polymorphisme pour faire une classe avec des switch et if else et ce n'est pas tres tres beau .

    merci a vous

  2. #2
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    L'idéal serait de modifier la fonction draw : elle fera deux choses différentes selon la valeur de typeobj. C'est peut-être pas la meilleure solution mais c'est en tout cas la plus simple.

    Il semblerait que tu stockes différents objets de type ObjRaw. Si tu as utilisé des templates dans ton Vector, alors quel que soit le résultat de ton cast, java prendra ton objet comme ObjRaw puisque c'est un vector de ObjRaw, et donc la méthode draw de ObjRaw sera appelée.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  3. #3
    Membre du Club
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 48
    Points
    48
    Par défaut
    Ce qui m'étonne c'est que dans le methode de parcours du vector de mes objets je fais :
    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
     
     
    private void drawDrawObj(int tx, int ty, double echelle,int zaCadre[])
    { 
      for (int i = 0 ; i < drawObjVector.size() ; i++)
      {
        CustomDrawObj drawObj =  CustomDrawObj)drawObjVector.elementAt(i);
     
        System.out.println("drawObj.type : " + drawObj.type);    
     
        switch (drawObj.type)
        {
             case Constes.OBJ_RECT : System.out.println("Cast OBJ_RECT");
        		                            drawObj = (CustomDrawPOLYG) drawObj;
        		                            break;
        	 case Constes.OBJ_CERCLE : System.out.println("Cast OBJ_CustomDrawCERCLE");
        		                               drawObj = (CustomDrawCERCLE) drawObj;
        		                               break;		
        } 
     
        System.out.println("drawDrawObj : " + drawObj.getClass());    
     
        drawObj.draw(bufGr,selColor,tx,ty,echelle,zaCadre,false,false);	
      }	
    }
    Et bien je passe bien dans le "case Constes.OBJ_RECT" et mon drawObj.getClass() me donne bien "CustomDrawPOLYG".
    Par contre dans le methode draw, je passe bien dans la méthode super(....) de mon objet mais ça s'arrete là.

    Je ne comprend pas. Ca doit être tellement énorme que je ne vois pas le problème.

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Pour essayer de t'éclaircir les idées...

    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    drawObj = (CustomDrawPOLYG) drawObj;
    ... ne sert absolument à rien. Je ne sais même pas t'expliquer ce qu'il faudrait que tu fasses, je ne vois pas, je peux juste te dire que x = (Toto) x est forcément un code qui ne sert à rien.

    Si drawObj.getClass renvoie CustomDrawPOLYG, alors drawObj est un objet de la classe CustomDrawPOLYG (heureusement ! ), et l'appel à draw sur cet objet activera la méthode draw de même signature de la classe CustomDrawPOLYG ou la plus proche parente ou ça correspond.

    Je ne sais pas si tout ça te servira à quelque chose...
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Pas besoin d'implémenter une variable type pour déterminer de quelle instance est ton objet. Pour ça tu as le mot-clé instanceOf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (drawObj instanceOf CustomDrawPOLYG) ...;
    Je te conseille de revoir un peu les tutoriaux du site, tu t'emmêles les pinceaux !

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Si tu as besoin de faire des tests pour connaître le type de tes objDraw, c'est que tu as un problème de conception. Le polymorphisme est justement là pour éviter ce genre de tests.

    Si tu veux que tes deux objets soient dessinés différemment, il te suffit de:

    - écrire une méthode abstraite draw() sur CustomDrawObj
    - implémenter réellement cette méthode pour les classes CustomDrawPOLYG, CustomDrawCERCLE

    - appeler objDraw.draw() => le polymorphisme fera le reste et appelera automatiquement la bonne méthode en fonction de la classe réelle de ton objet, sans qu'aucun cast explicite ne soit nécessaire
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

Discussions similaires

  1. objets anonymes dans un vector<> (3D)
    Par lightbulb dans le forum C++
    Réponses: 8
    Dernier message: 24/04/2010, 15h29
  2. Réponses: 1
    Dernier message: 25/07/2009, 00h12
  3. Pb liberation d'objets contenu dans un Vector
    Par pcouas dans le forum Langage
    Réponses: 1
    Dernier message: 12/06/2008, 00h00
  4. Réponses: 2
    Dernier message: 15/07/2007, 13h43
  5. Réponses: 1
    Dernier message: 11/07/2006, 13h17

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