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 横向投射的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ObjectC 向下拖动以关闭模式

如何在 ObjectC 中为 React Native 桥接 Swift View

iOS面试—3ObjectC 的本质

[ObjectC]Runtime运行时之三:方法与消息

[ObjectC]Runtime 运行时之一:类与对象

从 Android 投射 - 您可以投射整个应用程序还是只投射应用程序内的媒体内容