2010-09-18 4 views
1

J'essaie de remplacer tous les dynamicCasts de mon code par objectCast de QT. Mais j'ai rencontré un petit problème. Voici la hiérarchie de mes objets:objectCast Sideways casting

class ABase : public QObject 

class IAbility; // Registered as Qt Interface 
class ISize; // Registered as Qt Interface 

class Derived : public ABase, public IAbility, public ISize; // Uses Q_INTERFACES 

En utilisant objectCast je peux convertir un Derived à un iSize ou ESPONSABILITE. Cependant, dans un point de mon code, je veux effectuer la conversion suivante: Derived-> ISize-> IAbility. Ce dernier casting est l'endroit où je reçois une erreur. Puisque IAbility ne se rapporte à ISize d'aucune façon, cela pourrait causer un problème. Je pourrais faire un casting dynamique à ce stade, mais je préfère ne pas.

Répondre

3

Comme je vois que vous avez trois possibilités:

  1. Vous Énumérer les deux interfaces les uns aux autres en les mettant dans une hiérarchie d'héritage, laissant un autre hériter. Cela vous permettra de jeter de l'un à l'autre, dans une direction, mais sera également clonky et bancale s'il n'y a pas de réelle realtion entre les deux.
  2. Vous créez une super-interface dont les deux autres héritent, et vous l'utilisez comme un terrain commun, si vous voulez. Cela vous permettra de lancer l'objet de deux façons, en utilisant la super interface, mais aussi de créer une abstraction unnessecary.
  3. Vous transtypez votre objet Dérivé en ISize, faites ce que vous voulez, puis transtypez cette même référence dérivée en IAbility. Par conséquent: Derived -> ISize, Derived -> IAbility.

J'opterais pour l'option 3, simplement parce que c'est la solution la moins forcée, abstraction-sage.

+0

Malheureusement, la façon dont les classes sont présentées dans l'application actuelle. Le casting se passe dans une classe qui ne connaît pas Derived, donc je ne suis pas sûr que cela fonctionnerait. Mais l'option 2 fonctionnerait. J'ai une classe d'objet de niveau supérieur, donc créer une interface IObject de niveau supérieur que toutes les interfaces/objets doivent hériter virtuellement n'est peut-être pas si grave qu'une option. Merci. –

+0

Je suis heureux d'avoir pu aider. Bonne chance à vous! –