嵌套接口继承实现
Nested interface inheritance implementation
我遇到了嵌套接口声明和实现的场景,我正在寻找更好的解决方案。我能想到的两种可能的解决方案是在实现中使用包装器对象,或者使用菱形继承。我对包装器对象不满意,因为如果我在每个接口中有十多个方法,那么在每个实现类级别中都会有很多包装器方法。钻石继承实现更简洁,但我被告知尽可能避免使用钻石继承。有人能提出一个比这个问题中的2更好的替代方案吗?
包装器对象实现是
class IA
{
public:
virtual void MA() = 0;
};
class IB : public IA
{
public:
virtual void MB() = 0;
};
class IC : public IB
{
public:
virtual void MC() = 0;
};
class ID : public IC
{
public:
virtual void MD() = 0;
};
// ------------------------
class ImplA : public IA
{
public:
void MA() { /* do A */ }
};
class ImplB : public IB
{
public:
void MA() { a.MA(); }
void MB() { /* do B */ }
private:
ImplA a;
};
class ImplC : public IC
{
public:
void MA() { b.MA(); }
void MB() { b.MB(); }
void MC() { /* do C */ }
private:
ImplB b;
};
class ImplD : public ID
{
public:
void MA() { c.MA(); }
void MB() { c.MB(); }
void MC() { c.MC(); }
void MD() { /* do D */ }
private:
ImplC c;
};
钻石继承的例子是
class IA
{
public:
virtual void MA() = 0;
};
class IB : public virtual IA
{
public:
virtual void MB() = 0;
};
class IC : public virtual IB
{
public:
virtual void MC() = 0;
};
class ID : public virtual IC
{
public:
virtual void MD() = 0;
};
// ------------------------
class ImplA : public virtual IA
{
public:
void MA() { /* do A */ }
};
class ImplB : public IB, public virtual ImplA
{
public:
void MB() { /* do B */ }
};
class ImplC : public IC, public virtual ImplB
{
public:
void MC() { /* do C */ }
};
class ImplD : public ID, public ImplC
{
public:
void MD() { /* do D */ }
};
如果我面临复杂的设计任务,其中强烈涉及继承,那么CRTP就会出现在我的脑海中。但我不确定这对你是否有帮助。这在一定程度上取决于那些接口、类和方法的"含义"。
这就引出了"意义"与一般"设计"的关系问题。有两点很重要
- 可读性。尽可能简单明了
- 抽象。设计应该反映出它是现实世界中某个部分的模型
将您的两个解决方案绘制为UML(甚至没有UML(,您可能会发现其结构非常相似。例如,ImplC
将ImplB
的实例作为成员或将其作为父级。因此,这可以归结为组合与继承的问题。
相关文章:
- 我应该避免多重实现继承吗
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 类继承,ENUM 与 AST 类实现的问题
- C++ 使用接口和默认实现继承
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 将实现从继承的 CRTP 注入到继承的接口类
- 接口实现和私有继承之间的交互
- C 如何仅实现多个继承类的一个构造函数
- 如何在部分类模板专业化中实现继承
- 从接口和实现C 继承
- 编译器如何实现继承
- 为什么无法使用'using'指令实现继承的纯虚拟方法?
- 在子类中实现继承类的方法(param=指向父级的指针)(param=指向子级的指针)
- 从抽象基类的多个分部实现继承
- C++通过继承函数实现继承的抽象函数
- 如何在C++实现继承并解决错误"parent class is not accessible base of child class"?
- 编译器如何实现C++继承
- 代理dll:方法覆盖/方法转发(COM实现继承)
- 类型a必须实现继承的纯虚拟方法b
- 如何实现继承表单fstream的类