如何正确扩展接口
How to properly extend interface?
我有一个基于另一个的接口:
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也允许这样做)。
如上所述,使用虚拟继承,并确保在接口class
es中只使用纯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
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- C++中的VLA,扩展名为std=C++11
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 为重写std::exception的库生成swig接口时出错
- 继承Java集合接口(Set、Map、List等)的C++等价物是什么?或者扩展AbstractCollection
- 如何正确扩展接口
- 无需reinterpret_cast的可扩展库接口
- 使用继承扩展接口
- 具有扩展接口的派生类的集合.如何在没有动态强制转换的情况下访问派生接口
- 如何扩展/组合包含纯虚拟函数的接口类
- 为什么在 C++1y 中没有接口来获取 std 文件系统库扩展中的用户/组信息
- 可以在不重新编译客户端代码的情况下扩展虚拟接口吗?