objectCast 横向投射
Posted
技术标签:
【中文标题】objectCast 横向投射【英文标题】:objectCast Sideways casting 【发布时间】:2010-09-18 14:04:55 【问题描述】:我正在尝试用 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 没有任何关系,这可能会导致问题。我可以在这一点上做一个动态演员,但我宁愿不做。
【问题讨论】:
【参考方案1】:在我看来,您有三个选择:
-
您可以通过将两个接口置于继承层次结构中来将它们相互关联,让一个继承另一个。这会让你从一个方向投射到另一个,但如果两者之间没有真正的关系,也会显得笨拙和不稳定。
如果您愿意,您可以创建一个其他两个继承自的超级接口,并将其用作共同的铸造场地。这将让您以两种方式转换对象,使用超级接口,但也会创建不必要的抽象。
您将 Derived 对象转换为 ISize,执行您想要的操作,然后将相同的派生引用转换为 Iability。因此:派生 -> ISize,派生 -> IAbility。
我会选择选项 3,只是因为它是最不强制的解决方案,抽象方面。
【讨论】:
不幸的是,类在实际应用程序中的布局方式。演员表发生在一个不了解 Derived 的班级中,所以我不确定这是否可行。但是选项2会起作用。我确实有一个*** Object 类,因此创建一个所有接口/对象必须虚拟继承的*** IObject 接口可能不是一个糟糕的选择。谢谢。 很高兴我能帮上忙。祝你好运!以上是关于objectCast 横向投射的主要内容,如果未能解决你的问题,请参考以下文章