1

次のようなインターフェイス階層があります。

class A
{
public:
 void foo() = 0;
};

class B: public A
{
public:
void testB() = 0;
};

class C: public A
{
public:
void testC() = 0;
};

今、私はこれらのインターフェースを同じ階層、つまり Base classAImplで実装したいBImplと思ってCImplいますが、対応するインターフェースからそれらを派生させる方法がわかりません。

助けてください。前もって感謝します。

4

4 に答える 4

3

私は通常、多重継承を提案する前によく考えますが。あなたのニーズがあなたが言ったよりも複雑でない場合は、インターフェースと実装の両方を仮想的に継承してください。

class A
{
public:
  void foo() = 0;
};

class B: virtual public A
{
public:
  void testB() = 0;
};

class C: virtual public A
{
public:
  void testC() = 0;
};

class AImpl : virtual public A
{
 ...
}

class BImpl : virtual public B, virtual public AImpl
{
 ...
}

A仮想継承により、 との間で共有されるサブオブジェクトが 1 つだけになるようにBなりAImplます。だからあなたははっきりしているはずです。ただし、オブジェクトのサイズは大きくなります。それが問題である場合は、設計を再考してください。

于 2013-05-20T10:23:59.420 に答える
2

あなたが求めているのは、「インターフェイス」クラス階層を反映する実装の 2 番目のクラス階層を作成するにはどうすればよいかということだと思います。これは、インターフェイスと実装の間の結合を減らすために行います。あなたの問題は、実装クラスがインターフェイス クラスを拡張する必要があると考えていることですが、次のように、impl クラスの「自然な」継承階層も拡張する必要があります。

   AImpl
  ^    ^
  |    |
BImpl  CImpl

このパターンを説明する GoF (Gang of Four) Bridge パターンを参照することをお勧めします。実際、本の例はウィキペディアの例よりも優れていますが、オンラインで見つけることができないようです. 大まかな (ASCII) UML は次のとおりです。

Window <>imp----------------------------> WindowImpl
^    ^                                    ^        ^
|    |                                    |        |
|   TransientWindow                       |     PMWindowImp
IconWindow                              XWindowImp

上記の例では、実装を参照するWindowクラスがあります。#impしたがって、実際の作業を実行するためにIconWindow実装には#imp参照がありますが、クライアントはインスタンスを介してのみ参照します。これにより、再コンパイルのオーバーヘッドが削減されます。XWindowIconWindowIconWindow

重要な点は次のとおりです。

  • ウィンドウの種類 (通常のウィンドウ、アイコン ウィンドウ、ダイアログ) とウィンドウの実装 (X-windows、PMWindows) の個別のクラス階層。それらは独立して拡張できます。
  • 操作は WindowImp の抽象的な操作の観点から実装されているため、操作はプラットフォームの仕様から抽象化されています。
  • 抽象化と複数の実装を混在させようとした場合に発生するクラスの増殖を減らします。

これをあなたの問題に翻訳するのはあなたに任せますが、問題があればコメントしてください。

于 2013-05-20T10:39:49.647 に答える