我正在业余时间构建一个相当大的插件驱动的应用程序,并且遇到了停止设计缺陷的节目。我的应用程序使用基于策略/特征的设计,但因为我使用Qt,它只通过MI(而不是模板和MI)完成。其中一些类是纯虚拟的,有些类在最终用户永远不会触及的情况下执行相当重要的功能。
我的问题是这些类中的一些需要信号/插槽,因此从QObject派生,没有问题,我几乎可以从它继承。但是,我遇到的问题是当我想从Qt类派生,然后用我的一个或多个特征扩展它时,例如:
class Sy_abstractGLViewport : public QGLWidget, public Sy_saveable, public Sy_abstractObject
{
...
}
这里QGLWidget是从QObject派生的,但不是虚拟的,导致模糊问题。
我已经考虑过Bridge模式,例如我在Sy_saveable
纯虚拟中创建它,然后从中获取包含实际实现的Sy_saveable_imp
。然后通过聚合将其用于我的Sy_abstractGLViewport
。
这对我来说似乎相当不专业,因为该应用程序是基于插件的,对于我未来的插件编写者而言,它是将所有接口方法“连接”到聚合实例的PITA。我甚至无法通过宏自动化它,因为最终用户可能想要覆盖一个方法。
有没有人可以解决这个问题?或者一种不需要MI而是给我同样灵活性的模式?这是我的个人爱好项目,我不介意做很多重构 - 我想这样做正确。
答案 0 :(得分:1)
您不能从继承QObject的multiples clasess继承。
尝试使用合成而不是继承。请参阅composition over inheritance。
您也可以尝试使用Q3Signal课程。虽然根据QT doc它属于旧的QT3:
Q3Signal类可用于为不支持的类发送信号 继承QObject。