我在业余时间构建了一个相当大的插件驱动应用程序,并且遇到了一个显示停止设计缺陷。我的应用程序使用基于策略/特征的设计,但因为我使用 Qt,所以它只是通过 MI(而不是模板和 MI)来完成。其中一些类是纯虚拟的,而另一些则在底层执行最终用户不应该接触的相当关键的功能。
我的问题是其中一些类需要信号/插槽,因此从 QObject 派生,没问题我可以虚拟地从它继承。但是,我遇到的问题是,当我想从 Qt 类派生,然后用我的一个或多个特征扩展它时,例如:
class Sy_abstractGLViewport : public QGLWidget, public Sy_saveable, public Sy_abstractObject
{
...
}
这里 QGLWidget 是从 QObject 派生的,但不是虚拟的,会导致歧义问题。
我考虑了一个桥模式,例如,我在其中创建了Sy_saveable
纯虚拟,然后从中派生出一个Sy_saveable_imp
包含实际实现的桥模式。然后将其用于我的Sy_abstractGLViewport
通过聚合。
这对我来说似乎相当不专业,因为该应用程序是基于插件的,对于我未来的插件编写者来说,将所有接口方法“连接”到聚合实例有点像 PITA。我什至不能通过宏自动化它,因为最终用户可能想要覆盖一个方法。
有没有人解决这个问题的模式?或者不需要 MI 但给我同样的灵活性的模式?这是我个人的爱好项目,我不介意做很多重构——我想把它做好。