ここで私はコメントで述べた仮想継承ベースのソリューションです:仮想継承で
class FirstInterface
{
virtual int getId() const = 0;
};
class SecondInterface
{
virtual void setId(int id) = 0;
};
class CombinedInterface : virtual public FirstInterface,
virtual public SecondInterface
{
};
class FirstConcrete : virtual public FirstInterface
{
virtual int getId() const
{
return 1;
}
};
class CompleteConcrete : virtual public FirstConcrete,
virtual public CombinedInterface
{
virtual void setId(int id) { }
};
void example()
{
CombinedInterface * combinedInterface = new CompleteConcrete();
}
は、(部屋の中の象のほかに)必要なの唯一の変化はCompleteConcrete
乗算を持つことです - SecondInterface
の代わりにCombinedInterface
から継承します。このように考えることができます:CompleteConcreate
の画像では、SecondInterface
の追加だけでなく、CombinedInterface
をサポートするようになりました。
仮想継承を嫌う人もいます。私はしません。それはC++のユニークな機能の1つで、他の高レベル言語を共有するTMKはありません。これは非常に強力なツールであり、他の方法では解決しにくい特定の問題を解決することができます。仮想継承の二つの主な欠点は以下のとおりです。
、それは非常に強力なので、それは簡単に悪用されると、様々な問題につながることができます。
仮想継承されたクラスにデフォルト以外のコンストラクタがある場合、事実上継承するすべてのクラスがそれを構築する責任を負うため、すぐに苦労します。
しかし限り、仮想継承が正しく使用され、関与のクラスは自分自身を構築する取ることができますように、仮想継承は便利なツールです。
P.S.私はまた、ちょうど頭に浮かんだもう1つの代替ソリューションについても言及します。 、あなたはそれはのように、いくつかの特定の機能のために必要なことができるだけのように、あなたのCombinedInterface
を持っていると言う場合:
void somefunction(CombinedInterface &object);
あなたの機能を組み合わせインターフェースが必要です。
は小さな変更してください:
void somefunction(FirstInterface &first, SecondInterface &second);
をして、両方のパラメータと同じオブジェクトを渡します。両方のインタフェースを実装するCompleteConcrete
に、クラス階層を変更することなく渡すことができます。
template<typename T> void somefunction(T &&t)
{
real_somefunction(std::forward<T>(t), std::forward<T>(t));
}
void real_somefunction(FirstInterface &first, SecondInterface &second);
あなたはかなりCombinedInterface
を取り除くと、単にsomefunction()
に両方のインターフェイスを実装する任意のオブジェクトを渡すと、あなたのreal_somefunction()
することができます:あなたはまた、機能がまだ一つのパラメータを取るように見えますテンプレートのファサードを持つことができます1つまたは他のパラメータを使用して適切なインタフェースを呼び出します。
両方のインターフェイスを実装するオブジェクトへのポインタを持ち歩く必要があるとします。
class combined_pointer : public std::pair<FirstInterface *, SecondInterface *> {
public:
template<typename T> combined_pointer(T *t)
: std::pair<FirstInterface *, SecondInterface *>(t, t)
{}
};
ちょうど出発点。
私は仮想継承を使用してこの作業を行うことができます。また、階層を少し微調整することもできます。残りの部分を仮想継承で動作させることができれば、それは1つの答えになります。仮想継承が何を意味するのかわからない場合は、おそらくこれはうまくいかないでしょう。 –
本当に 'CombinedInterface'が必要ですか? – Jarod42
構成を使用して実装を再利用することができます。 – Jarod42