如何正确扩展接口

How to properly extend interface?

本文关键字:接口 扩展 何正确      更新时间:2023-10-16

我有一个基于另一个的接口:

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在同一个班上两次是对的吗?

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

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

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

这在很大程度上取决于类内部的逻辑,但IMO您最好使用组合:

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

多重继承很少是答案。

仅从IExtendedDrawable导出ExtendedDrawableImplementation。这样一来,它将同时拥有两个接口。我不明白你为什么要从这两者中得到。

我不是C++程序员,但据我所知,这是正确的。IDrawable没有两次,但有多个路径。请参阅http://en.wikipedia.org/wiki/Diamond_problem#The_diamond_problem