次の場合:クラス「Base」とその多くのサブクラス(「Derivative1」、「Derivative2」など)を定義するバイナリライブラリがあるとします。
これらのサブクラスを自分のコードで拡張したいのですが、私の拡張はBaseの一部のみを処理するため、すべてのサブクラスで同じであるため、すべてのDerivativeクラスをサブクラス化し、同じコードを何度も追加するのは面倒です。
私の最初のアイデアは、私のために作業を行うクラステンプレートを作成することでしたが、私が扱っているライブラリはQtであるため、QObjectは私を失敗させました。私の2番目のアイデアは、マクロを使用して各クラス構造を生成することでしたが、これもmocによって阻止されました。
タイトルの「親」は、Baseから派生してBaseExtendedを作成し、コンパイラにこの拡張クラスのすべての派生を再親にするように指示したためです。たとえば、「BaseExtended」仮想で「Base」を宣言してから、次のように記述する方法はありませんか。
class Derivative1Extended : public Derivative1, public BaseExtended {}
そして、BaseExtendedの仮想BaseがDerivative1のBaseを指しているので、基本的にBaseとDerivative1の間で拡張機能を「絞り込み」ますか?
(ちなみに、私は上記をできるだけ一般的にしようとしましたが、実際に行っているのは、すべてのQWidget派生物に同じコードを何度も何度も書かずに、「focusIn」と「focusOut」のシグナルを追加しようとしています。私が使用するQWidgetサブクラス)
編集:参考までに、これが私の現在の実装です:
// qwidgetfs.h
class QLineEditFS : public QLineEdit
{
Q_OBJECT
private:
void focusInEvent(QFocusEvent *);
void focusOutEvent(QFocusEvent *);
public:
QLineEditFS(QWidget *parent = 0);
signals:
void focusReceived(QWidgetFS::InputType);
void focusLost();
};
// qwidgetfs.cpp
QLineEditFS::QLineEditFS(QWidget *parent /*= 0*/)
: QLineEdit(parent)
{}
void QLineEditFS::focusInEvent(QFocusEvent *e)
{
QLineEdit::focusInEvent(e);
emit focusReceived(QWidgetFS::InputText);
}
void QLineEditFS::focusOutEvent(QFocusEvent *e)
{
QLineEdit::focusOutEvent(e);
emit focusLost();
}
そして、これはQSpinBoxFS、QComboBoxFS、QCheckBoxFSなどで繰り返されます...代わりに、このロジックを共通クラスQWidgetFSで定義し、QWidgetから派生した他のクラスに「注入」したいと思います。