J'utilise des pseudo-interfaces en C++, c'est-à-dire des classes abstraites pures. Supposons que j'ai trois interfaces, IFoo, IBar et IQuux. J'ai aussi une classe Fred qui met en œuvre tous les trois d'entre eux:Vérification de l'implémentation de l'interface de compilation dans C++
interface IFoo
{
void foo (void);
}
interface IBar
{
void bar (void);
}
interface IQuux
{
void quux (void);
}
class Fred : implements IFoo, IBar, IQuux
{
}
Je veux déclarer une méthode qui accepte un objet qui implémente IFoo et IBar - un Fred fonctionnerait, par exemple. La seule compilation façon de le faire, je peux imaginer est de définir un troisième IFooAndBar d'interface qui implémente les deux, et redéclarer Fred:
interface IFooAndBar : extends IFoo, IBar
{
}
class Fred : implements IFooAndBar, IQuux
{
}
Maintenant, je peux déclarer ma méthode comme la réception d'un IFooAndBar *. Jusqu'ici tout va bien.
Cependant, ce qui se passe si je veux aussi une autre méthode qui accepte BIRA et IQuux? J'ai essayé de déclarer une nouvelle interface IBarAndQuux et déclarant Fred comme héritant à la fois:
class IFooAndBar : IFoo, IBar
{
};
class IBarAndQuux : IBar, IQuux
{
};
class Fred : IFooAndBar, IBarAndQuux
{
};
Cela fonctionne quand je passe comme Fred IFooAndBar à une méthode; Cependant, quand je tente d'appeler la barre de Fred() directement, gcc se plaint:
error: request for member ‘bar’ is ambiguous
error: candidates are: void IBar::bar()
error: void IBar::bar()
ce qui rend cette solution plus ou moins inutile.
Ma prochaine tentative a été de déclarer Fred comme héritant des trois interfaces individuelles, et en faisant la méthode accepte l'une des interfaces hybrides en tant que paramètre:
class Fred : public IFoo, public IBar, public IBaz
{
};
void doTest (IBarAndBaz* pObj)
{
pObj->bar();
pObj->baz();
}
Lorsque je tente de passer Fred comme IBarAndBaz paramètre *, je reçois une erreur, comme prévu:
error: cannot convert ‘Fred*’ to ‘IBarAndBaz*’ for argument ‘1’ to ‘void doTest(IBarAndBaz*)’
dynamic_cast <> aussi p roduces une erreur (que je ne comprends pas)
error: cannot dynamic_cast ‘pFred’ (of type ‘class Fred*’) to type ‘class IBarAndBaz*’ (source type is not polymorphic)
Obliger un casting ne travail, cependant:
doTest((IBarAndBaz*)pFred);
mais je me demande comment ce coffre-fort et portable est (je développe pour Linux, Mac et Windows), et si cela fonctionne dans une situation réelle.
Enfin, je me rends compte ma méthode peut accepter un pointeur sur l'une des interfaces et dynamic_cast à l'autre (s) pour appliquer le type de paramètre correct lors de l'exécution, mais je préfère une solution de compilation.
Ce n'est pas sûr et c'est portable. En fait, il est indéfini en C++. –