|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
Salut, j'ai un problème de base mais je ne comprends pas très bien le mécanisme à adopter, si quelqu'un pouvait me guider. J'ai par exemple, 3 classes :
Code :
Code :
Merci d'avance ^^ |
||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Développeur informatique Inscription : décembre 2006 Messages : 1 355 ![]() |
A mon avis cette ligne :
Code :
PEngine.computeCollisionResponse(solid1, solid2); Donc une solution peut etre d'utiliser instanceof puis un casting a la classe adequate. Ou sinon implementer des methodes au niveau de tes classes SolidRectangle et SolidCircle. Exemple : Code :
solid1.computeCollisionResponse(solid2); Code :
computeCollisionResponse(Solid solid); |
|
|
00
|
|
|
#3 | ||||||
|
Nouveau Membre du Club
![]() Inscription : juillet 2006 Messages : 113 ![]() |
à mon avis tu ajoute ces deux method dans tes class, et comme ça seulon le type des parametre java va savoire quel méthod utiliser.
Code :
Code :
en tous cas, tu doit développer deux methodes Code :
computeCollisionResponse(Solid solid); Code :
|
||||||
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
Bonjour,
je vois bien une solution simple: Code :
|
||
|
|
00
|
|
|
#5 | ||
|
Membre éprouvé
![]() Inscription : janvier 2006 Messages : 355 ![]() |
Bonjour,
Moi je préférerais plutôt ceci : Code :
|
||
|
|
00
|
|
|
#6 | ||
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
C'est vrai qu'on est obligé de modifier la classe abstraite pour chaque classe ajoutée, mais tu oublie un point
ce code est faux: Code :
pour bien faire il faudrait des instance d'opérateur binaire isCollision(Solid,Solid) , surchargés pour chaque type de couple Solid-Solid (un peu comme un Comparator), ce qui trop compliqué pour un cas simple comme celui-ci. |
||
|
|
00
|
|
|
#7 | |||
|
Membre éprouvé
![]() Inscription : janvier 2006 Messages : 355 ![]() |
Citation:
Tout est question de définition des concepts. |
|||
|
|
00
|
|
|
#8 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
D'accord, moi je l'avais interprété comme étant de la collision d'objets géométrique
de toutes façon, nos méthodes se rejoignent sur le fait qu'il faut appeler les objets par une seule méthode d'entrée publique "collideWith(Solid)" que tu implémente dans les sous classes pour plus d'évolutivité, et que moi je préfère implémenter dans la superclasse pour mieux "vérouiller" le code si jamais toutes les classes sont interdépendantes. Ce qui nous oblige à utiliser le instanceOf: dans les 2 cas, on est obligé. |
|
|
00
|
|
|
#9 | ||||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
Salut,
et merci beaucoup pour vos réponses Mon but est en effet de pouvoir tester toutes les combinaisons possibles. J'aimerais vraiment éviter d'utiliser instanceof si c'est possible car ca me semble un peu lourd. Pour le collideWith je crois je vais finalement passer par une méthode de la classe statique PEngine, ca m'évitera des doublons de code, ca pourrait donner un truc du style : Code :
Code :
En tout cas merci encore pour vos avis et suggestions ^^ (passés et futurs ;P) |
||||
|
|
00
|
|
|
#10 | ||||
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
C'est une bonne idée en terme de conception de vouloir éviter l'instanceOf, et bien souvent ça montre que le polymorphisme est mal employé, en particulier quand le "message" i.e. la méthode s'adresse à un seul objet polymorphe.
idée de départ de polymorphisme là on a 2 objets polymorphe, et c'est le drame, on atteind la limite du polymorphisme Java, et comme je tentait de l'évoquer, on pourrait tenter de passer outre en Définissant un type supplémentaire sous classé pour chaque couple de sous-classe de Solid-Solid: Code :
C'est un sujet intéressant au niveau conceptuel, même si au niveau réalisation c'est carrément overkill( surtout si tu est en JME comme j'au cru comprendre) ta solution basée sur du static, ou alors sur la super classe Pour ce qui est de l'utilisation des static, pour moi la programmation objet doit toujours être logique, et donc dans notre cas l'objet doit pouvoir porter ses méthodes, quitte à rediriger sur des classes "utilitaires" constituées de méthodes statiques. Autre solution: tu ne duplique rien si tu met tout ton code dans la classe abstraite (mais on se demande alors l'utilité de sous-classer) Conception et implémentation d'un polymorphisme "binaire" sans instanceOf pour revenir au cas d'école de sous classement de Collision, j'improvise à l'instant ma solution: Dans une Factory destinée à instancier les Solid, on peut également instancier toutes les possibilités de Collision, et les affecter à 2 tableau collisionCandidates1 et collisionCandidates2 communs à tous les objets Solid d'un type... tout ça dans le seul but d'exploiter le polymorphisme de l'objet Solid sur 2 méthodes polymorphe me rendant les opérateurs binaires possibles (les Candidate) pourquoi 2? pour ensuite extraire l'intersection des 2 ensembles, et ne retenir que l'opérateur binaire possible. C'est un peu long, mais on n'a utilisé aucune instanceOf, et je ne vois pas plus imple pour l'instant. A défaut d'antériorité sur l'algo, appelons ça le "Deltree Overkill Binary Candidate Pattern" et voici le code Code :
|
||||
|
|
00
|
|
|
#11 |
|
Membre éprouvé
![]() Inscription : janvier 2006 Messages : 355 ![]() |
Moi je n'ai toujours pas compris cette notion de collision, comment cela se traduit-elle ? Par exemple, qu'est-ce qui doit être vérifié pour conclure qu'un solidCircle est en collision avec un solidRectangle ? Il doit certainement y en avoir des variables membre qui sont comparées, mais lesquelles ?
|
|
|
00
|
|
|
#12 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
Les collisions c'est la gestion des objets dans un jeu 3D par exemple: 2 objet ne peuvent pas se trouver au même endroit sinon ils sont en collision: si c'est un mur on n'avance plus etc.
géométriquement ça se traduit par le fait que 2 objets sont en collision s'il existe un point (x,y) qui appartient aux 2 figures géométriques (ou (x,y,z) en 3D ). Dans la pratique, l'algo va rechercher l'intersection entre les figures gémétrique. |
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
Effectivement, l'idée du DOBCP est intéressante
|
|
|
00
|
|
|
#14 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
ouaip, à défaut, un pattern BCP si ça fait un peu mégalo le nom de pseudo dans un pattern. as-tu essayé? ou est-ce que finalement tu n'avais pas besoin des instanceOf avec des méthodes static? |
|
|
00
|
|
|
#15 | ||||||||
![]() ![]() Consultant informatique Inscription : février 2004 Messages : 1 192 ![]() |
Pourquoi ne pas essayer une approche du type Visitor comme mentionne plus haut ?
Ca parait la solution adequate, exemple avec du code: Code :
Code :
Code :
Code :
Et d'implementer les collideWith avec en signature les solides possible au niveau collision, pour l'exemple j'ai utilise une classe PEngine contenant en static le code des collisions (et pas besoin de 36 signatures pour 2 memes types comme tu peux le voir) Si une collision n'est pas implementee dans la classe collideWith retournera false. En cas d'ajout d'un solide une nouvelle methode collideWith doit etre ajoutee a Solid et un collideWith doit etre defini dans chaque classe pouvant entrer en collision avec le nouveau solide. C'est lourd mais c'est l'inconvenient du typage dynamique a la mode java, pas le choix. Bulbo
__________________
[Java] [NetBeans] [CVS] La FAQ Java Merci de ne pas me poser de questions techniques par MP. !! J'aurais voulu être une conserve !! |
||||||||
|
|
00
|
|
|
#16 | ||||||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
Salut,
merci pour cette nouvelle réponse ^^ deltree << non, j'ai pas tenté Finalement j'ai tout résolu en statique, ca m'a semblé le moins lourd et le plus maintenable, donc pas de Solid.collideWith mais plusieurs fonctions statiques dans PEngine. En cas d'ajout d'une classe de solide, seule PEngine est modifiée. Je suis passé par des interfaces étant donné que l'héritage multiple n'existe pas :/, car en réalité j'ai (Solid<-SolidRectangle; Solid<-MovableSolid<-MovableSolidRectangle). J'avais donc besoin d'une interface ISolidRectangle. J'ai donc des méthodes dans PEngine prenant en arguments des interfaces : Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#17 |
|
Membre confirmé
![]() Inscription : mai 2007 Messages : 242 ![]() |
J'ai réfléchi pendant 1/4 heure pour comprendre comment ça marche, pourtant je connait le pattern Visitor, mais je butait sur la méthode collideWith implémentée dans chaque classe pour faire un appel à la méthode surchargée et typée. Bref, c'est un bon compromis simplicité/modularité. ça ne vaudrais pas le coup de faire un JSR (?) à Sun pour qu'on puisse utiliser dynamiquement une surcharge au lieu de laisser tous les développeur de la Terre se faire des noeuds aux cerveaux là-dessus? |
|
|
00
|
|
|
#18 | ||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
bulbo, avec ce code j'aurai quand même le problème que j'avais au départ pour le parcours de boucle non ? à savoir que les bonnes méthodes ne seront pas appelées en fonction des types réels des instances, étant donné que je suis obligé de caster pour la récupération :
Code :
(J'ai du louper un truc, je réexamine le code ^^) |
||
|
|
00
|
|
|
#19 | |||
![]() ![]() Consultant informatique Inscription : février 2004 Messages : 1 192 ![]() |
Citation:
C'est un poil plus d'implementation que ce que tu fais mais tu tires vraiment avantage de la liaison dynamique et pas besoin de listes separees. Bulbo
__________________
[Java] [NetBeans] [CVS] La FAQ Java Merci de ne pas me poser de questions techniques par MP. !! J'aurais voulu être une conserve !! |
|||
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 914 ![]() |
Effectivement j'avais vraiment lu à l'arrache
Cette solution est très intéressante. Je vais réfléchir à ce que je vais faire (et peut-être tester les 2 soluces en termes de vitesse, ca ajoute quand même quelques pointeurs pour chaque instance d'objet, je suis pas un rapace mais bon |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com