Aide sur les surcharges de méthodes

Aide sur les surcharges de méthodes - Java - Programmation

Marsh Posté le 06-12-2003 à 12:38:31    

Bonjour,
 
 
je suis en train de réaliser un jeu de cartes, et pour cela, j'ai réalisé une classe CCard abstraite, qui est ensuite dérivé en plusieurs classe fille, une pour chaque type de carte du jeu (c'est un jeu de vaisseaux spatiaux) : CCardShip, CCardBlast, CCardOperation.
 
J'ai besoin, dans une de mes classes (CLibrary), d'avoir une méthode Add, qui prends en paramètre un objet d'un deds trois types ci-dessus, et l'ajoute dans la pile de cartes qui lui est associé : il y a en effet trois pile de cartes dans le jeu.
 
J'aurais besoin d'utiliser cette méthode Add de cette manière :

Code :
  1. class frame_add_card
  2. {
  3.    CCard card_;
  4.    CLibrary lib_ = new CLibrary();
  5.  
  6.    [...]
  7.  
  8.        // action déclenché sur le bouton OK (un bout de Swing :)
  9.        public void jButtonOk_actionPerformed(ActionEvent e)
  10.        {
  11.            if (this.jRadioShip.isSelected())
  12.            {
  13.                CCardShip a_card = new CCardShip();
  14.                [Set des valeurs de la carte];
  15.            }
  16.            else if (this.jRadioBlast.isSelected())
  17.            {
  18.                CCardBlast a_card = new CCardBlast();
  19.                [Set des valeurs de la carte];
  20.  
  21.            }
  22.            [etc. ...]
  23.  
  24.                card_ = a_card;
  25.        }
  26.  
  27.    [...]
  28.  
  29.        // ajoute la carte dans la bibliothèque
  30.        public void GetCard ()
  31.        {
  32.            lib_.Add(card_);
  33.        }
  34.  
  35. }


 
Ce que j'aimerais, c'est pouvoir avoir une seule méthode Add, surchargée éventuellement (surement même ;) ), et que suivant le type de a_card, la bonne méthode est appelée, et la carte est effectivement ajoutée dans la bonne pile.
 
Le problème, c'est que actuellement, ca marche :D
En effet, je suis obligé de créer une méthode Add(CCard a_card); , sinon, j'ai une erreur de compilation.
Mais si je crée cette méthode, alors, c'est toujours elle qui est appelée, au lieu de celle qui correspondrait au type de la carte que je veux ajouter ...
 
 
Voilà, j'espère que quelqu'un pourra m'aider, ou au moins, m'éclaircir sur la marche à suivre :)
 
Merci !


Message édité par multani-1 le 03-07-2008 à 11:09:14
Reply

Marsh Posté le 06-12-2003 à 12:38:31   

Reply

Marsh Posté le 06-12-2003 à 12:46:02    

ben post les erreurs de compils :o
(je relis ton bins en attendant)

Reply

Marsh Posté le 06-12-2003 à 12:46:32    

[:totoz] du Java MFC

Reply

Marsh Posté le 06-12-2003 à 12:46:51    

bon ok. Vu comme t'as fait ca y'a pas trop moyen
 
le pb c'est que tu stockes dans ta classe un CCard. Donc tout ce que le compilo peut savoir la, c'est que l'objet est de type CCard.  Et quit c'st qui resoud les pb de surcharge ? le compilo. Donc y'a pas moyen de faire ce que tu veux.
 
par contre,pas la peine de te suicider, tu peux t'en tirer, soit en castant ton CCard en CBlastCard, regarder si tu te manges une ClassCastException, si oui reassayer en CShipMachin etc etc sinon avec les instanceof


Message édité par chrisbk le 06-12-2003 à 12:49:02
Reply

Marsh Posté le 06-12-2003 à 12:48:48    

chrisbk a écrit :

ben post les erreurs de compils :o
(je relis ton bins en attendant)


 
Ben j'ai pas d'erreur, c'est juste que ca fait pas ce que je voudrais que ca fasse :(

Reply

Marsh Posté le 06-12-2003 à 12:49:17    

J'vais essayer de condenser mon problème :D

Reply

Marsh Posté le 06-12-2003 à 12:49:49    

ou alors tout simple dans ta classe tu te met un pety entier qui decrit le type de la carte (0 = ship....) et ensuite tu fais tes test sur cet entier
 
'fin bon y'a ouainte mille solution :o


Message édité par chrisbk le 06-12-2003 à 12:50:04
Reply

Marsh Posté le 06-12-2003 à 12:52:23    

Oké :)
 
Pour ta première soluc, je cast où ? au moment ou je fais card_ = a_card;, parce que après, en fait, je sais pas quel est le type de card_ ...
 
Et pour le coup deds entiers, si c'était aussi simple que mon exemple, j'y aurais déjà pensé, mais en fait, c'est encore plus compliqué que ca :D

Reply

Marsh Posté le 06-12-2003 à 12:53:07    

Taz a écrit :

[:totoz] du Java MFC  


Juste parce que je préfixe mes classes par C ? :whistle:

Reply

Marsh Posté le 06-12-2003 à 12:56:57    

multani-1 a écrit :

Oké :)
 
Pour ta première soluc, je cast où ? au moment ou je fais card_ = a_card;, parce que après, en fait, je sais pas quel est le type de card_ ...


 
tu peux faire tout ca soit avant d'appeler ta fonction, soit dans la fonction appelée (ton add machin)
mais le cast c pas le plus beau, regarde le isinstance (si c bien ca le mot clé)
 
pour la partie en gras : toi non, mais Java si (il garde les infos sur les type de ses objets pendant qu'il tourne, ca permet justement les trucs genre ClassCastException)


Message édité par chrisbk le 06-12-2003 à 12:57:54
Reply

Marsh Posté le 06-12-2003 à 12:56:57   

Reply

Marsh Posté le 06-12-2003 à 12:57:59    

multani-1 a écrit :


Juste parce que je préfixe mes classes par C ? :whistle:  

euh les _ dans tous les sens aussi, des majuscules partout sauf là où il en faudrait vraiment

Reply

Marsh Posté le 06-12-2003 à 12:58:40    

Taz a écrit :

euh les _ dans tous les sens aussi, des majuscules partout sauf là où il en faudrait vraiment


 
nan, les _  en fin de nom de variable c'est pas du MFC, MFC c'est m_ [:aloy]

Reply

Marsh Posté le 06-12-2003 à 13:02:13    

ben les mecs ils ont pas du lire bien leur spécification, parce que le m_ c'est quasi universel sauf chez les programmeurs MS, dans leur code c'est toujours le concours de celui qui en mettra le plus devant ou derriere (j'ai meme dejà vu des __bidule, évidemment ça pétait tout puisque les identifiants __ sont réservés

Reply

Marsh Posté le 06-12-2003 à 13:13:08    

chrisbk a écrit :


 
tu peux faire tout ca soit avant d'appeler ta fonction, soit dans la fonction appelée (ton add machin)
mais le cast c pas le plus beau, regarde le isinstance (si c bien ca le mot clé)
 
pour la partie en gras : toi non, mais Java si (il garde les infos sur les type de ses objets pendant qu'il tourne, ca permet justement les trucs genre ClassCastException)
 


 
Pour avoir le type de l'objet, ya une méthode getClass, je peux peut-être me démerde avec ca ...
Mais ca retourne un type "Class", je le compare comment avec celles que j'ai ??

Reply

Marsh Posté le 06-12-2003 à 13:14:57    

Taz a écrit :

euh les _ dans tous les sens aussi, des majuscules partout sauf là où il en faudrait vraiment


 
Ben les _, je les mets à la fin des membres privés d'une classe, et les majuscules, ben au début de chaque mot [:spamafote]
Qu'est-ce qui te plait pas dans mes majuscules ? :)


Message édité par multani-1 le 06-12-2003 à 13:16:34
Reply

Marsh Posté le 06-12-2003 à 13:16:21    

c'est parfaitement illisible et on peut pas faire un truc plus source d'erreur

Reply

Marsh Posté le 06-12-2003 à 13:17:38    

Ouais, je trouve ca plus lisible qu'un truc tout de la même casse ...

Reply

Marsh Posté le 06-12-2003 à 13:20:35    

enfin bon là n'étais pas la question

Reply

Marsh Posté le 06-12-2003 à 13:22:10    

Certe, mais si je programme vraiment comme un pied, et que je suis le seul à pouvoir relire mon code, c'est pas forcément mieux non plus. Tes conseils sont donc les bienvenus :jap:

Reply

Marsh Posté le 06-12-2003 à 13:35:22    

bah laisse tomber cette notation idiote CClasse. mets des majuscules aux noms de types, etc et lis le document Java Coding Style  
http://java.sun.com/docs/codeconv/

Reply

Marsh Posté le 06-12-2003 à 17:09:57    

chrisbk a écrit :

en castant ton CCard en CBlastCard, regarder si tu te manges une ClassCastException, si oui reassayer en CShipMachin etc etc sinon avec les instanceof  


[:totoz]
 
le instanceof est quand même préférable, hein [:mlc]
 

multani-1 a écrit :


Pour avoir le type de l'objet, ya une méthode getClass, je peux peut-être me démerde avec ca ...
Mais ca retourne un type "Class", je le compare comment avec celles que j'ai ??


nan mais vraiment, utilise instanceof !
 
ex : if (uneVariable instanceof String) { ... }
 

Taz a écrit :

c'est parfaitement illisible et on peut pas faire un truc plus source d'erreur


mais bon, y a des convention de codage en Java ...
 
faux-edit : grilled by taz
 

chrisbk a écrit :

'fin bon y'a ouainte mille solution :o


tout a fait.  
Par exemple, tu peux aussi stocker tes cartes dans différentes variables (chacune du type qui va bien) plutot que dans une seule (card_) du type CCard ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-12-2003 à 18:03:23    

benou a écrit :


[:totoz]
 
le instanceof est quand même préférable, hein [:mlc]
 


 
c'est un peu ce que je dis un peu plus loin

Reply

Marsh Posté le 06-12-2003 à 18:32:34    

chrisbk a écrit :


 
c'est un peu ce que je dis un peu plus loin


ouais ouais j'ai vu, mais le fait même de penser au coup du cast + try/catch m'a totozé  :sweat:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-12-2003 à 18:36:51    

benou a écrit :


ouais ouais j'ai vu, mais le fait même de penser au coup du cast + try/catch m'a totozé  :sweat:  


 
ben y'en a visiblement bien qui font des while(1) sur un parcours de tableau et attendent la OutOfBound :D
 
de tres bon [:aloy]

Reply

Marsh Posté le 06-12-2003 à 18:38:23    

chrisbk a écrit :


ben y'en a visiblement bien qui font des while(1) sur un parcours de tableau et attendent la OutOfBound :D


mais arrête de dire des trucs comme ca, ils vont t'entendre !!! [:totoz]


Message édité par benou le 06-12-2003 à 18:40:10

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-12-2003 à 18:42:29    

benou a écrit :


mais arrête de dire des trucs comme ca, ils vont t'entendre !!! [:totoz]


 
d'ailleurs perso je test pu sur nul, j'attaque comme un bourrin et j'attends recuperer la NullPointerException [:ddr555]

Reply

Marsh Posté le 06-12-2003 à 19:07:55    

chrisbk a écrit :


 
d'ailleurs perso je test pu sur nul, j'attaque comme un bourrin et j'attends recuperer la NullPointerException [:ddr555]

:/


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-12-2003 à 02:14:34    

multani-1 a écrit :

une seule méthode Add, surchargée éventuellement (surement même ;) ), et que suivant le type de a_card, la bonne méthode est appelée, et la carte est effectivement ajoutée dans la bonne pile.

Tu viens de voir pourquoi le pattern Visiteur existe, félicitations.  
Juste un petit détail technique, la "bonne" solution ne nécessite ni surcharge ni "instanceof" ni cast ni rien qui mette le système de types en vrac, contrairement à ce que je lis au-dessus, et dans l'esprit dans lequel tu étais parti.
 
Petit rappel : on ne demande pas son age à une vielle dame, par contre, elle peut te le donner spontannément (ce qui se traduit par : on fait pas un switch/case sur getClass ou sur instanceof). La solution repose entièrement sur le lien retardé des méthodes.
 
quelques références :
 
http://c2.com/cgi/wiki?VisitorPattern
http://128.42.6.89/JavaResources/D [...] attern.htm
GoF (Gamma, Helm, Johnson, Vlisside) Design Pattern page 387 (dans le version française).
 
Je ne te donne pas le code pour ton cas, mais juste quelques pistes : tes cartes sont les Visités, le truc que tu appelles CLibrary (il me fait flipper ce nom, je sens qu'il y a un pb dans ta conception) est le visiteur.
 
Voilou, essaye de grenouiller un peu avec ses infos et vient poser des questions.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 07-12-2003 à 17:06:32    

Bon, j'ai jeté un coup d'oeil au pattern Visiteur, et c'est vrai que ca à l'air assez puissant :) peut-être trop pour ce que je veux faire. Je vais le relire pour bien tout comprendre.
 
Pour ton coup de flip ;) sur CLibrary (qui s'appelle maintenant Library d'ailleurs ...) :
en fait, le bout de code que je vous ai filé reprends en gros ce que je veux faire, mais pas le code exact, c'est déjà assez compliqué comme ca :/ (c'est presque plus dur de synthétiser son problème que de le résoudre :D)
 
Library, c'est ma classe qui représente la pile de cartes (la bibliothèque, en langage "joueur" ). Je l'ai concu comme ca : j'ai une classe StackCard, qui encapsule une LinkedList, et possède des méthodes Pop, Push, PushBottom, Randomize
 
et une classe Library, qui encapsule StackCard, de manière à avoir des méthodes plus parlantes en terme de jeu (Draw, Put, Shuffle)
 
 
Voilà quoi.
Bon, je me replonge dans le pattern Visiteur pour voir si ca me convient :)
 
Merci de vos réponses :hello:

Reply

Marsh Posté le 07-12-2003 à 17:10:44    

Crois-moi c'est le pattern conçu pour ton cas. Par contre, au début c'est assez chaud de voir quel pattern sert à quoi.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 07-12-2003 à 18:15:43    

multani-1 a écrit :

c'est presque plus dur de synthétiser son problème que de le résoudre :D


pas toujours "presque" d'ailleurs :hello:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-12-2003 à 18:41:41    

Cool, ca marche super bien avec en utilisant le pattern.
 
J'ai donc rajouter une méthode dans les classes Card* correspondant aux objets que je voulais ajouter dans mes Library.

Code :
  1. class CardShip
  2. {
  3. [...]
  4. public boolean Accept (CardSet visitor)
  5. {
  6. return visitor.AddToLibrary(this);
  7. }
  8. }


 
puisqu'en fait c'est CardSet qui ajoute dans les Library (j'ai aussi renommer la méthode que je voulais surcharger, mais je sais pas si c'était obligé).
 
Et j'appelle cette méthode simplement par :

Code :
  1. class CardSet
  2. {
  3. Library lib_ship;
  4. Library lib_blast;
  5. [etc...]
  6. public boolean Add(Card a_card)
  7. {
  8. return a_card.Accept(this);
  9. }
  10. public boolean AddToLibrary(CardBlast card)
  11. {
  12. return lib_blast.Add(card);
  13. }
  14. [etc...]


 
Bon, ca reprends pas vraiement le code que j'ai posté en premier post, mais on fait le lien facilement ... (j'espère  :whistle: )
 
Merci :hello:


Message édité par multani-1 le 07-12-2003 à 18:49:40
Reply

Marsh Posté le 07-12-2003 à 19:14:55    

félicitations. C'est exactement ça.
 
 
heu juste un détail : en général on ne surcharge pas, on met directement le nom du type dans la méthode.
par exemple :

Code :
  1. public boolean AddCardBLastToLibrary(CardBlast card) {
  2. ...
  3. }


ça permet de voir directement en regardant le visiteur de savoir ce qu'il visite (dans les résumés).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 07-12-2003 à 19:45:02    

Ok, j'vais corriger ca :D
 
 
Bon allez, maintenant, je me mets à DOM [:666]

Reply

Marsh Posté le 07-12-2003 à 19:47:07    

mais ca oblige à ajouter du code dans un objet en fonction de son utilisation et pas en fonction de sa nature :/
 
A moins de wrapper, mais bof, quoi :/
 
je continue à penser que de garder différentes variables pour stocker les différentes cartes était une meilleur solution ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2003 à 19:59:56    

benou a écrit :

mais ca oblige à ajouter du code dans un objet en fonction de son utilisation et pas en fonction de sa nature :/
 
A moins de wrapper, mais bof, quoi :/
 
je continue à penser que de garder différentes variables pour stocker les différentes cartes était une meilleur solution ...


Je vois pas trop ce que tu veux dire par là ... Tu peux détailler stp ?
 
 
Sinon, pour les différentes variables, j'y avais pensé, mais en pratique, dans mon code, ca peut pas marcher :sweat:
 
Enfin bon, le problème n'est pas ultra critique hein :D C'est pas une appli temps réel, ni en jeu 3D ultra sophistiqué :D

Reply

Marsh Posté le 07-12-2003 à 20:24:15    

benou a écrit :

mais ca oblige à ajouter du code dans un objet en fonction de son utilisation et pas en fonction de sa nature

non, un code supportant sa relation avec les autres objets.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 07-12-2003 à 21:50:08    

nraynaud a écrit :

non, un code supportant sa relation avec les autres objets.


ouais ben c'est bien ce que je dis ...
 
à partir du moment où il avait fait son objet et que, après coup, quand il doit l'utiliser d'une certaine façon il doit modifier son objet c'est qu'il y a un problème : soit son objet manquait de fonctionnalité à la base, soit il veut l'utiliser d'une mauvaise façon.  
Le pattern dont tu parlais tend à adapter un objet à chaque nouvelle "utilisation". Si cette "utilisation" fait partie du rôle de l'objet, ok. Mais dans le cas de multani-1, j'ai pas l'impression que ce soit opportun.
 


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2003 à 22:04:23    

benou a écrit :


ouais ben c'est bien ce que je dis ...
 
à partir du moment où il avait fait son objet et que, après coup, quand il doit l'utiliser d'une certaine façon il doit modifier son objet c'est qu'il y a un problème : soit son objet manquait de fonctionnalité à la base, soit il veut l'utiliser d'une mauvaise façon.  
Le pattern dont tu parlais tend à adapter un objet à chaque nouvelle "utilisation". Si cette "utilisation" fait partie du rôle de l'objet, ok. Mais dans le cas de multani-1, j'ai pas l'impression que ce soit opportun.

ben moi je pense que c'est opportun, on fait quoi ? duel au petit jour ? Si les règles du jeu disent que les différent types de cartes doivent être dispatchés sur des tas différents, alors il y a une relation dans le modèles de domaine entre les tas et les types de cartes. Qu'il ait ignoré cet aspect dans un premier temps est normal, il construit son truc peu à peu, capture de nouvelles abstractions progressivement, par refactoring itératif. Au bout d'un moment il est tombé sur une truc qu'il n'avait pas encore pris en considération.
 
de toutes façons il n'existe pas d'autre arrangement, même un instanceof est une forme dégénérée de Visiteur, dont on aurait élimité toutes les sécurités et dont on aurait rompu la règle de l'expertise.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 07-12-2003 à 22:07:19    

c'était juste mon avis ...
 
je tiens pas à avoir LA vérité, moi ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed