【问题标题】:Supporting multiple plugin versions支持多个插件版本
【发布时间】:2018-01-15 02:32:20
【问题描述】:

C++ Qt5

我的应用有一个插件架构,有 6 种不同类型的插件。 API 由 7 个头文件组成,每个头文件包含一个抽象类:1 个带有一些通用内容的基类,以及 6 个其他的,每种类型一个。每个抽象类都包含一些常量、纯虚函数和槽以及信号定义(所有类都有 Q_OBJECT 宏)。类型特定的类继承自基类。

插件本身是具有“外部”工厂函数的动态库,该函数返回指向类实例的指针,这些类实例是特定于类型的抽象类的实现。

到目前为止一切都很好。然而,是时候为插件添加新功能,从而创建插件 API 的新版本了。以防万一有人创建了 3rd 方插件,我也想支持基于旧版本的插件。

在当前设置下,插件包含应用使用的完全相同的头文件,这意味着每次引入更改时都必须重新编译所有插件。不支持旧插件版本。

如果我为每个插件提供其自己的 API 标头副本,则基于旧版本的插件将不兼容,并且应用程序很可能会因某些分段错误而死掉。同样,不支持旧插件版本。

我想到的另一件事是每个版本都有自己的类。所以我想要base_1、base_2、typeA_1、typeA_2、typeB_1、typeB_2等。但是Q_OBJECT不支持多重继承,所以如果typeA_1继承自base_1,typeA_2不能同时继承自typeA_1和base_2。那样不行。更不用说它会为维护代码而创造的地狱,即使它工作......

有人知道如何处理这种情况吗?或者要重新设计什么以使其易于管理?

代码可以在launchpad.net/waver查看

【问题讨论】:

  • 这个问题可能更适合 SE Software Engineering。
  • user0042 没有 SE 和 Software Engineering 等标签...

标签: c++ qt inheritance


【解决方案1】:

如果有人遇到类似情况,我最终会这样做。

  1. 将插件 API 的每个版本放入其自己的目录中(这意味着基类和特定类型抽象类的标头)。插件类型仍然从基础继承,但版本之间没有任何联系。

  2. 插件可以包含他们想要使用的任何版本的标头。

  3. 每个插件都必须重写一个方法以返回兼容性级别指示器。

  4. 不再转换从加载的插件库中获得的对象。相反,我使用 Qt 的 MetaObject 及其 Invoke 方法来执行插件方法。

  5. 兼容级别指示器可用于检查可以执行哪些方法以及可以连接哪些信号。

像魅力一样工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2021-11-19
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多