我有一个类A
.
类(class) B
和 C
是从类 A
派生的接口(interface).
A
/ \
B C
现在我必须实现类 D
和 E
对于B
和 C
.
然后有一些类:FDB
, GDC
, HEC
, IEB
, JDB
, KDC
, LEB
, MEC
(虽然这些类名称末尾的 DB
和 DC
表示该类使用 D
和 B
作为 DB
的结尾, D
和 C
作为 DC
的结尾, E
和 B
对于 EB
等。
所以:
class A..
class `B`: public virtual `A`..
class `C`: public virtual `A`..
class `D`: public B, public `C`..
class `E`: public B, public `C`..
class `FDB`: public `D`..
class `GDC`: public `D`..
class `HEC`: public `E`..
class `IEB`: public `E`..
class `JDB`: public `D`..
class `KDC`: public `D`..
class `LEB`: public `E`..
class `MEC`: public `E`..
但后来我继承了钻石,但我不想要它。
有人可以建议另一种设计吗?
感谢任何帮助!
您想要/需要避免多重继承的原因是什么?
无论哪种方式,如果在某些情况下您不能(不想)使用继承,请使用封装:
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)holder,通过protected inheritance和CRTP继承。这样,一个单独的基类拥有 C 基本功能,但从它继承的类没有公共(public)基类:
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()
等)来实现公共(public)接口(interface)。
自 DependsOn<D, C>
不同于DependsOn<E, C>
,您只有一个由整个层次结构实现的通用接口(interface)。