Je suis en train de concevoir un jeu. Dans le jeu, les différents objets du jeu étendent différentes interfaces (et une classe abstraite) en fonction de ce qu'ils doivent faire, et sont transmis à des gestionnaires qui s'occupent des éléments avec une interface spécifique à des intervalles définis (ils répartissent en fait tout leur travail d'une manière soignée pour s'assurer que les entrées/vidéos/etc sont toujours traitées).
Quoi qu'il en soit, certains de ces objets étendent la classe abstraite Collider et sont transmis à un CollisionHandler. La classe Collider et le gestionnaire s'occupent de tout ce qui est techniquement impliqué dans la collision, et demandent simplement qu'un objet implémente une fonction collidesWith(Collider c), et se modifie en fonction de ce avec quoi il est entré en collision.
Des objets de nombreuses classes différentes entreront en collision les uns avec les autres et se comporteront très différemment selon le type d'objet avec lequel ils sont entrés en collision et ses attributs spécifiques.
La solution parfaite semble être d'utiliser instanceof comme ceci :
class SomeNPC extends Collider{
collidesWith(Collider c){
if(c instanceof enemy){
Fight it or run away depending on your attributes and theirs.
}
else if(c instanceof food){
Eat it, but only if it's yellow.
}
else if(c instanceof BeamOfLight){
Try to move towards its source.
}
}
}
Ça semble être un endroit légitime pour une instance. J'ai juste ce mauvais pressentiment. Comme si un goto avait un sens dans une situation particulière. Quelqu'un a-t-il l'impression que le design est fondamentalement différent ? Si oui, que recommanderiez-vous de faire pour obtenir le même comportement ?