2011-07-27 6 views
1

かなり大きなプラグイン駆動型のアプリケーションを余計な時間に作成しています。私のアプリはポリシー/特性ベースのデザインを使用していますが、私はQtを使用しているため、テンプレートとMIではなくMIを介して行われます。これらのクラスのいくつかは純粋な仮想であり、エンドユーザーが決して触れるべきではないフードの下でかなり重要な機能を実行するものもあります。C++でのQObject多重継承とポリシー/特性の問題

私の問題は、これらのクラスのいくつかは信号/スロットを必要とし、したがってQObjectから派生していますが、問題はほとんどありません。

class Sy_abstractGLViewport : public QGLWidget, public Sy_saveable, public Sy_abstractObject 
{ 
    ... 
} 

ここでQGLWidgetは、曖昧さの問題を引き起こし、事実上はQObjectから派生しますが、されていません。しかし、私が持っている問題は、私はQtのクラスから派生して、私の特性、例えばの一つ以上でそれを拡張したいときです。

私はブリッジパターンを考えました。たとえば、Sy_saveableという純粋な仮想を作成し、実際の実装が含まれているSy_saveable_impを得ています。それから私のSy_abstractGLViewportのためにそれを集約を使って使用してください。

これは私にとって、アプリがプラグインベースであるため、プロフェッショナルではないように思えます。将来のプラグイン作家が集約されたインスタンスへのすべてのインタフェースメソッドを「フックアップ」するためのちょっとしたPITAです。エンドユーザーがメソッドをオーバーライドしたいので、マクロを使って自動化することさえできません。

誰もがこの問題を解決するパターンを持っていますか?またはMIを必要としないが、私に同じ柔軟性を与えるパターン?この私の個人的な趣味のプロジェクトは、私は多くのリファクタリングをしても構いません - 私はそれをしたい

+1

これを行うかどうかはわかりませんが、QObjectから仮想的に継承しません。 Qt 4.7以前では動作しますが、Qt 4.8では動作しない可能性があります。 https://bugreports.qt.nokia.com/browse/QTBUG-19717 – masebase

答えて

1

QObjectを継承する複数のクラスターから継承することはできません。

継承の代わりに合成を使用してください。 composition over inheritanceを参照してください。

Q3Signalクラスを試すこともできます。それはQTドキュメントに従って、古いQT3に属しているものの:

Q3Signalクラスは はQObjectを継承していないクラスのための信号を送信するために使用することができます。

+0

親クラスで仮想継承として宣言されている限り、QObjectから複数回継承できますが、Qt独自のクラスでは継承できません。また、構成上の問題は、ユーザーが(アクセサーメソッドを適切に構築するために頼りにしているため)必要のないメソッドを基本的にオーバーライドすること、または単に関連アクセサを作成しないことです。 – cmannett85

+3

いいえ、あなたはQObjects(http://doc.qt.nokia.com/latest/moc.html#multiple-inheritance-requires-qobject-to-be- first)で仮想継承を使用するはずです。しないでください、コードがコンパイルされていても、あなたは奇妙な動作に陥ります。 –

+0

私は怠け者で構成が気に入らないので、これが私の唯一の方法だと認めなければなりませんでした。私は私の古い特性クラスのインターフェイスを作成し、次にエンドユーザーが集約メンバーから派生する「実装」クラスを作成することで、is_a関係を維持することができました。 – cmannett85