0

クラスAがクラスBとして派生するAPIを開発しています。

APIユーザーがクラスAとクラスBの両方の機能をアプリケーションレベルで拡張したい場合は、問題が発生します。

アプリケーションユーザーがクラスAを拡張するクラスAXとクラスBを拡張するクラスBXを思いついたとします。この場合、クラスBの基本クラスはクラスAXではなくクラスAであるため、ユーザーはクラスBXに対して期待される動作を取得しません。

考え:アプリケーションユーザーは、クラスBとクラスAXの両方を使用してクラスBXを拡張できますが、この場合、既知のダイアモンドの動作があると思います。

この問題を解決するための標準的な方法を教えてください。

4

4 に答える 4

1

あなたの質問は少し曖昧です。とにかく、特にC ++FAQ25質問25.5を読むことをお勧めします。質問25.5と25.6は、いくつかの代替案について説明しています。

于 2012-06-07T03:48:03.617 に答える
1

テンプレート パラメーターから継承するクラスもオプションです。擬似コード:

class A;

template<typename WhichA>
class B : public WhichA;

class AX : public A;

class BX : public B<AX>;
于 2012-06-07T03:51:29.933 に答える
0

...しかし、この場合、ダイヤモンドの振る舞いが知られていると思います

だから問題は何ですか ?virtual継承は、そのようなダイヤモンドパターンを解決するためのものです。
の子Aが実質的に継承されている場合は、デザインを変更しない限り問題はありません。

于 2012-06-07T03:49:14.633 に答える
0
class InterfaceA;

class InterfaceB;

class A : public InterfaceA;

template<class AType>
class B_Template : public InterfaceB, public AType;

// Below is same as class B in example
// Users can use B as if it was class B
typedef B_Template<A> B;   

// User can extend A
class AX : A;

// User can extend B any way they want (you can't police this)
// but the way you wanted in the question was:
class BX : B_Template<AX>;   // Inherits of the extended AX

これで質問は解決しますが、コメントで指摘されているように、継承ではなく依存性注入を検討する必要があります。

また、Interface クラスは実際には必要ありませんが、基本クラスのコントラクトが何であるかを明確にすることができます。つまり、テンプレート パラメーター AType は InterfaceA を満たす必要があります

于 2012-06-07T04:51:28.937 に答える