如何正确扩展界面?

时间:2012-08-21 19:29:29

标签: c++

我有基于另一个的界面:

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是否正确?

4 个答案:

答案 0 :(得分:4)

我会怀疑你确实需要/想要多重继承。我认为它只在有限的情况下很好,而接口就是其中之一(甚至Java允许这样做)。

如上所述,使用虚拟继承并确保仅在接口virtual es中使用纯class方法。

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*/}
};

答案 1 :(得分:3)

这在很大程度上取决于课程内部的逻辑,但IMO最好不要使用作文:

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

多重继承很少是答案。

答案 2 :(得分:1)

只需从ExtendedDrawableImplementation派生IExtendedDrawable。这样它无论如何都会有两个接口。我不明白为什么你想从这里得到两个。

答案 3 :(得分:0)

我不是C ++程序员,但从我记忆中来看,这是正确的。您没有IDrawable两次,但您有多个路径。见http://en.wikipedia.org/wiki/Diamond_problem#The_diamond_problem