5

私は別のものに基づいたインターフェースを持っています:

class IDrawable {
public:
   virtual ~IDrawable();
};

class IExtendedDrawable: public IDrawable {
public:
   virtual ~IExtendedDrawable();
};

class DrawableImplementation: public IDrawable {
public:
   virtual ~DrawableImplementation();
};

class ExtendedDrawableImplementation: 
   public DrawableImplementation, public IExtendedDrawable
{
public:
   virtual ~ExtendedDrawableImplementation();
};

次にExtendedDrawableImplementation= DrawableImplementation (+IDrawable)+IExtendedDrawable (+IDrawable)

IDrawable同じクラスに2回参加するのは正しいですか?

4

4 に答える 4

5

私はあなたが本当に多重継承を必要としている/望んでいるという疑いの利益を与えます。私はそれが限られた状況でのみ良いと思います、そしてインターフェースはそれらの1つです(Javaでさえこれを許可します)。

上記のように、仮想継承を使用virtualし、インターフェイスclassesでは純粋なメソッドのみを使用するようにしてください。

class IDrawable {
public:
   virtual ~IDrawable();
   virtual void doSomething() = 0;
};

class IExtendedDrawable: virtual public IDrawable {
public:
   virtual ~IExtendedDrawable();
   virtual void doSomethingElse() = 0;
};

class DrawableImplementation: virtual public IDrawable {
public:
   virtual ~DrawableImplementation();
   virtual void doSomething() {/*code here*/}
};

class ExtendedDrawableImplementation: 
   public DrawableImplementation, public IExtendedDrawable
{
public:
   virtual ~ExtendedDrawableImplementation();
   virtual void doSomething() {/*code here*/}
   virtual void doSomethingElse() {/*code here*/}
};
于 2012-08-21T19:47:31.743 に答える
3

クラス内のロジックに大きく依存しますが、IMO では代わりにコンポジションを使用する方がよいでしょう。

class ExtendedDrawableImplementation : public IExtendedDrawable
{
   IDrawable* drawableImplementation; //points to a DrawableImplementation
public:
   virtual ~ExtendedDrawableImplementation();
};

多重継承が答えになることはめったにありません。

于 2012-08-21T19:32:36.833 に答える
1

ExtendedDrawableImplementationから派生するだけIExtendedDrawableです。そうすれば、とにかく両方のインターフェースを持つことになります。ここで両方から派生させたい理由がわかりません。

于 2012-08-21T19:51:58.150 に答える
0

私は C++ プログラマーではありませんが、覚えている限りでは正しいです。IDrawable を 2 回持っているわけではありませんが、複数のパスがあります。http://en.wikipedia.org/wiki/Diamond_problem#The_diamond_problemを参照してください。

于 2012-08-21T19:33:47.230 に答える