Mais je n'ai jamais dit qu'il fallait appliqué le pattern visitor pour cet exemple...
Ceci dit, je pense qu'il ne faudrait passer qu'un argument à la methode visit du Visitor, l'autre argument pourrait etre passer dans le constructeur du visitor.
Mais je n'ai jamais dit qu'il fallait appliqué le pattern visitor pour cet exemple...
Ceci dit, je pense qu'il ne faudrait passer qu'un argument à la methode visit du Visitor, l'autre argument pourrait etre passer dans le constructeur du visitor.
Bonjour,
Sujet très intéressant. Je sais pas si vous avez lu ces liens :
http://accu.org/index.php/journals/496
http://multijava.sourceforge.net/
Bon courage !
En tout cas, c'est certain que le pattern visitor ne peut rien faire dans votre cas.
Une methode qui utilise la reflexion.
Attention je sens qu'il y en a qui vont pas aimer.
Moi non plus je ne suis pas trop satisfait il faut dire... Noament du au probleme d'heritage avec la method getMethod...
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 import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public abstract class Solid { public boolean collision(Solid solid) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{ Method method = null ; try { method = PEngine.class.getMethod("computeCollision", new Class[]{this.getClass(),solid.getClass()}); return ((Boolean)method.invoke(null, new Object[]{this,solid} )).booleanValue(); } catch (NoSuchMethodException e) { method = PEngine.class.getMethod("computeCollision", new Class[]{solid.getClass(),this.getClass()}); return ((Boolean)method.invoke(null, new Object[]{solid,this} )).booleanValue(); } } }
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 public class PEngine { public static boolean computeCollision(SolidCircle circle1, SolidCircle circle2) { System.out.println("Collision Circle " + circle1 + " with Circle " + circle2); return true; } public static boolean computeCollision(SolidCircle circle, SolidRectangle rect) { System.out.println("Collision Circle " + circle + " with Rectangle " + rect); return true; } public static boolean computeCollision(SolidRectangle rect1, SolidRectangle rect2) { System.out.println("Collision Rectangle " + rect1 + " with Rectangle " + rect2); return true; } }
J'ai pas suivi toute la discussion, mais je me dis que saupoudrer un peu de generics pourrait simplifier la chose.
Par exemple on pourrait transformer ton interface en :
Puis, il te suffirait par exemple pour ta classe SolidCircle de faire un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 interface Collidable<S extends Solid> { boolean collideWith(Collidable aSolid); boolean collideWith(S aSolid); }
Ça éviterait comme disait bulbo de devoir modifier ton interface si tu ajoutais une classe dérivée de Solid.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 class SolidCircle extends Solid implements Collidable<SolidCircle>,Collidable<SolidRectangle> { ...
Bon, je dis ça, mais j'ai vraiment pas tout suivi
Bonjour
J'ai essayé ta solution que je trouvais assez surprenante mais celle ci ne compile pas. Avec Eclipse, voici le message que j'ai :
Est ce normal ? Ai je loupé un truc ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part The interface Collidable cannot be implemented more than once with different arguments: Collidable<SolidCircle> and Collidable<SolidRectangle>
Thomas
Ha, ba peut-être que c'est pas possible. Zut
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager