2010-09-18 2 views
1

Я пытаюсь заменить все dynamicCasts в моем коде объектом объекта QT. Но я столкнулся с некоторой проблемой. Вот иерархия моих объектов:objectCast Боковое литье

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 

Использование objectCast я могу преобразовать Derived к ISize или IAbility. Однако в одной точке моего кода я хочу выполнить следующее преобразование: Derived-> ISize-> IAbility. Этот последний бросок - это то место, где я получаю сообщение об ошибке. Поскольку IAbility никак не связана с ISize, это может вызвать проблему. В этот момент я мог бы сделать динамический бросок, но я бы предпочел.

ответ

3

Как я вижу у вас есть три варианта:

  1. Вы связаны два интерфейса друг с другом, помещая их в иерархии наследования, позволяя один наследовать другие. Это позволит вам отбрасывать от одного к другому в одном направлении, но также будет клонированным и выигрышным, если между ними нет реальной реальности.
  2. Вы создаете суперинтерфейс, который наследуют два других, и используйте это как обычное литье, если хотите. Это позволит вам использовать объект двумя способами, используя супер интерфейс, но также создаст необъяснимую абстракцию.
  3. Вы передаете свой производный объект в ISize, делаете то, что хотите, а затем накладываете ту же производную ссылку на IAbility. Следовательно: Derived -> ISize, Derived -> IAbility.

Я бы выбрал вариант 3, просто потому, что это наименее принудительное решение, абстракция.

+0

К сожалению, способ размещения классов в реальном приложении. Кастинг происходит в классе, который не знает о Derived, поэтому я не уверен, что это сработает. Но вариант 2 будет работать. У меня есть класс Object на верхнем уровне, поэтому создание интерфейса IObject верхнего уровня, который все интерфейсы/объекты должны фактически наследовать, возможно, не так уж плох. Благодарю. –

+0

Рад, что я мог помочь. Удачи тебе! –