Multi Dispatch, RTTI, polymorphisme
Bonjour,
J'ai déjà effectué des recherches notamment sur le forum mais je n'arrive pas concrètement à voir la solution :
Il s'agit peut être d'un problème classique mais je cherche à gérer la collision entre différents objets d'un petit jeu, sachant que les collisions ne sont pas identiques entre les différents objets :
Pour faire simple, voila comment je pourrai gérer le collision pour chaque classe dérivée :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
class Shape
{
public :
virtual double GestionCollision( const Shape& p_shape ) = 0 ;
} ;
class Circle : public Shape
{
public :
virtual double GestionCollision( const Shape& p_shape ) ;
} ;
class Rectangle : public Shape
{
public :
virtual double GestionCollision( const Shape& p_shape ) ;
} ; |
et pour chaque fonction GestionCollision, il faudrait que je gère les cas possibles. :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
double Circle : Intersect( const Shape& p_shape )
{
const type_info& monType = typeid( p_shape ) ;
if( monType == typeid( Rectangle ) )
{
//ma gestion
...
}
} |
Sauf qu'a chaque nouvelle classe dérivée, je devrais ajouter la gestion de cette nouvelle forme :cry: . Ce n'est pas extensible et facilement maintenable.
J'ai lu sur un lien récent du forum que les solutions à mon problème sont le double|multi Dispatch/le pattern observateur/RTTI.
Seulement dans mon code appelant, je gère une liste de Shape et chaque itération je viens tester les collisions de cette manière :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
BOOL ClasseAppelante::CheckShapeCollision(Shape* p_TestShape){
vector<Shape*>::iterator iShape;
for (iShape= m_vShape.begin(); iShape!= m_vShape.end(); iShape++)
{
if (p_TestShape == (*iShape))
continue;
// Test la collision
if (p_TestShape->TestCollision(*iShape))
//gestion collision
return GestionCollision((*iShape), p_TestShape);
}
} |
Mon problème est que J'ai du mal à voir par exemple comment utiliser le pattern observateur ou RTTI et l'intégrer dans mon code. Je voudrais que cela reste générique et pouvoir ainsi ajouter de nouvelles classes sans toucher à ma classe de base et aux classes dérivées.
J'espère avoir été clair :?
merci