1

我正在尝试用 QT 的 objectCast 替换我的代码中的所有 dynamicCast。但我遇到了一些障碍。这是我的对象的层次结构:

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 没有任何关系,这可能会导致问题。我可以在这一点上做一个动态演员,但我宁愿不做。

4

1 回答 1

3

在我看来,您有三个选择:

  1. 您可以通过将两个接口置于继承层次结构中来将它们相互关联,让一个继承另一个。这会让你从一个方向投射到另一个,但如果两者之间没有真正的关系,也会显得笨拙和不稳定。
  2. 您创建一个其他两个继承自的超级接口,并将其用作共同的铸造基础,如果您愿意的话。这将让您以两种方式转换对象,使用超级接口,但也会创建不必要的抽象。
  3. 您将 Derived 对象转换为 ISize,执行您想要的操作,然后将相同的派生引用转换为 Iability。因此:派生 -> ISize,派生 -> IAbility。

我会选择选项 3,仅仅是因为它是最不强制的解决方案,抽象方面。

于 2010-09-18T15:09:36.997 回答