2010-09-18 84 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