我在業餘時間構建了一個相當大的插件驅動應用程序,並且遇到了停止設計缺陷的展示。我的應用程序使用基於策略/特徵的設計,但因爲我使用Qt,所以僅通過MI(而不是模板和MI)完成。其中一些類是純虛擬的,一些類在最終用戶不應該觸及的情況下執行相當重要的功能。C++中的QObject多重繼承和策略/特性設計問題
我的問題是,這些類中的一些需要信號/插槽,因此從QObject派生,沒問題,我可以實際上從它繼承。不過,我的問題是,當我想從一個Qt類派生,然後用一個或多個我的性狀進行擴展,如:
class Sy_abstractGLViewport : public QGLWidget, public Sy_saveable, public Sy_abstractObject
{
...
}
這裏QGLWidget來繪圖是從繼承自QObject,但不是幾乎,引起歧義的問題。
我已經考慮了一個橋樑模式,例如我的Sy_saveable
純虛擬,然後從中導出一個Sy_saveable_imp
,它包含實際的實現。然後通過聚合使用我的Sy_abstractGLViewport
。
這對我來說似乎相當不專業,因爲該應用程序是基於插件的,這對我未來的插件編寫者將所有接口方法「掛接」到聚合實例中有點PITA。我甚至無法通過宏自動化它,因爲最終用戶可能想重寫一個方法。
有沒有人解決這個問題的模式?或者不需要MI的模式,但給了我相同的靈活性?這是我個人的嗜好項目,我不介意做很多重構 - 我想要做right。
不知道你是否這樣做,但我不會從QObject幾乎繼承。它在qt 4.7和之前的版本中運行,但可能不會在qt 4.8中運行。請參閱https://bugreports.qt.nokia.com/browse/QTBUG-19717 – masebase