C ++ Qt5
我的应用程序有一个插件架构,有6种不同类型的插件。 API由7个头文件组成,每个头文件包含一个抽象类:1个带有一些常见内容的基类,另外6个用于每种类型。每个抽象类包含一些常量,纯虚函数和槽,以及信号定义(所有类都有Q_OBJECT宏)。特定于类的类继承自基类。
插件本身就是带有" extern"的动态库。返回指向类实例的类的实例的工厂函数。
到目前为止一切顺利。但是,是时候向插件添加新功能,从而创建插件API的新版本。为了防止有些人创建第三方插件,我也想支持基于旧版本的插件。
使用当前设置,插件包含应用程序使用的相同头文件,这意味着每次引入更改时都必须重新编译所有插件。不支持旧的插件版本。
如果我为每个插件提供自己的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上查看代码
答案 0 :(得分:0)
如果有人遇到类似的情况,这就是我最终要做的事情。
将每个版本的插件API放入其自己的目录中(这意味着基本的标题和特定类型的抽象类)。插件类型仍然从基础继承,但版本之间没有连接。
插件可以包含他们想要使用的任何版本的标题。
每个插件都必须覆盖一个返回兼容级别指示符的方法。
不再强制从已加载的插件库中获取对象。相反,我使用Qt的MetaObject及其Invoke方法来执行插件方法。
兼容性级别指示器可用于检查可以执行的方法以及可以连接的信号。
像魅力一样。