2010-09-18 64 views
1

我试图用QT的objectCast替换我的代码中的所有dynamicCasts。但是我遇到了一些障碍。这里是我的对象的层次结构: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 

使用objectCast我可以转换派生于ISize或IAbility。但是,在我的代码中,我想要执行以下转换:Derived-> ISize-> IAbility。最后一次演员是我遇到错误的地方。由于IAbility与ISize无关,因此可能会导致问题。我现在可以做一个动态演员,但我宁愿不要。

回答

3

当我看到它,你有三种选择:

  1. 您可以通过将它们在继承层次涉及两个接口给对方,让一个继承等。这可以让你从一个方向向另一个方向投射,但如果两者之间没有真正的联系,它也会变得笨拙而诡异。
  2. 您创建了另外两个继承的超级接口,并将其用作普通铸造场地(如果愿意的话)。这会让你使用超级接口两种方式来施放对象,但也会创建一个不太通用的抽象。
  3. 你投你的派生类对象到ISize,做你想做的,然后抹上相同的衍生提及的IAbility。因此:派生 - > ISize,派生 - > IAbility。

我会去选择3,只是因为它是最不强制的解决方案,抽象明智的。

+0

不幸的是,类在实际应用中的布局方式。该演员发生在一个不知道Derived的类中,所以我不确定这会起作用。但选项2会起作用。我确实有一个顶级的Object类,因此创建一个顶级的IObject接口,所有的接口/对象都必须实际继承,可能并不是那种糟糕的选项。谢谢。 – 2010-09-18 15:30:48

+0

很高兴我能帮到你。祝你好运! – 2010-09-18 16:46:16