我有一个班级A
。
类B
和C
是从类A
派生的接口。
A
/ \
B C
现在我必须为D
和E
实施类B
和C
。
然后有一些课程:FDB
,GDC
,HEC
,IEB
,JDB
,KDC
,{{1} },LEB
(同时MEC
和DB
在这些类名称的末尾表示该类使用DC
和D
作为{的结尾{1}},B
和DB
用于D
,C
和DC
用于E
等。
这样:
B
然后我有钻石继承,我不想要它。
有人可以提出另一种设计吗?
任何帮助表示赞赏!
答案 0 :(得分:2)
您希望/需要避免多重继承的原因是什么?
无论哪种方式,如果你不能(不想)在某些情况下使用继承,请使用封装:
class A..
class `B`: public virtual `A`..
class `C`: public virtual `A`..
class `D`: public B {
private:
C c_instance_;
};
class `E`: public B {
C c_instance_;
};
...
为避免代码重复,您可以创建C(或D)持有者并通过受保护的继承和CRTP继承它。这样,一个单独的基类保存了C基本功能,但是从它继承的类没有公共基类:
class A..
class B: public A..
class C: public A..
template<class Specialized, class DependedOn>
class DependsOn {
protected:
DependedOn& get() { return implementation_; }
private:
DependedOn implementation_;
};
class D: public B, protected DependsOn<D, C> .. // inheritance with CRTP
class E: public B, protected DependsOn<E, C> .. // inheritance with CRTP
class FDB: public D, protected DependsOn<FDB, B> ..
D
,E
,FDB
等将在内部使用get()
方法(或更具体地说,DependsOn<D, C>::get()
,DependsOn<E, C>::get()
等等)实现公共接口。
由于DependsOn<D, C>
与DependsOn<E, C>
不同,因此您只有整个层次结构实现的公共接口。