私は次のデザイン問題に遭遇しています:カスタムインターフェイスの定義中にライブラリクラスを継承する
私はアプリケーションにQt C++ライブラリを使用しています。このライブラリには、すべてQAbstractItemModel
(例えばQAbstractTableModel
,QStandardItemModel
など)を継承する「モデル」クラスがあります。私はこれらのクラスのいくつかを継承したいが、それぞれが共有しなければならない私自身のインターフェースを定義する。
私は現在、これをやっている方法は、インターフェイス(純粋な仮想クラス)を定義して継承クラスを継承することです。例として、私はクラスがdoSomething
機能を持つようにQAbstractTableModel
を継承したいとしましょう:
class MyInterface {
public:
virtual void doSomething() = 0;
}
class MyModel : public QAbstractTableModel, public MyInterface {
...
}
しかし、私はちょうどQAbstractItemModel
として周りのオブジェクトを渡したいです。インターフェイスクラスを使用するには、オブジェクトをMyInterface
オブジェクトにキャストしてから、関数を呼び出す必要があります。これにより、すべての場所にキャストが発生します。さらに、他の誰かがQAbstractItemModel
から継承している独自のクラスを作成しても、インターフェースを継承しないとエラーの余地があるようです。
私はこのすべてを達成するために使用できるより良い設計はありますか?
オブジェクトがdoSomething()メソッドを持っていることを知るためのテンプレートシステムです。このクラスはQAbstractTableModel以上のものであることが必要です。QAbstractTableModelポインタ/参照(Qt関数など)のみが使用可能な場合はキャストが必要です - これで問題はまったく解決されません –
MyInterfaceクラスは問題をまったく解決しません。 C++のすべての機能を使用して解決する前にしようとしている可能性があります。 –
それは私が壊している契約についての良い考えです。それは私が全体の問題について私の立場を再考すべきだと私に思います。 – buck