我有一个特定的情况(在C ++中),我希望避免在一组类中重复相同的代码,这些类从另一组类派生,我无法将此代码粘贴到其中。并且以某种方式解决这个问题最终导致钻石继承问题。以下示例将解释这种情况:
template <class T>
class A{
...
virtual List<T>* create_list() = 0; //Factory method
};
template <class T>
class B: public A{
... // Does NOT implement create_list, as
//List is an abstract class and is not implemented
//at this level of abstraction
};
现在,我们有一组派生自上述任何抽象类的类。
class C: public A{};
class D: public B{};
class E: public B{};
... and so on
我们以List
VectorList
所有 通过返回create_list
来实施VectorList
。实现是所有这些的相同:
VectorList* create_list(){
return new VectorList;
}
我能想到的唯一方式,我不需要在所有C
,D
和其他类似的类中重复上述代码行,是创建一个实现X
的类A
,并使所有这些都执行多重继承。也就是说,
class X: public A{
VectorList* create_list(){
return new VectorList;
}
};
class C: public A, public X;
class D: public B, public X;
然而,这会产生钻石继承问题,这意味着我必须使用虚拟继承。但我明白这不是一个好的设计。
还有其他选择吗?
答案 0 :(得分:0)
使用界面和组合:
为A类创建一个接口(让我们称之为IA)。 为类A创建一个默认实现(让我们称之为implA)
class implA: public IA
为B类创建一个接口(让我们称之为IB)
class IB: public IA
为B类创建默认实现(让我们称之为implB)
class implB: public implA, public IB
在implA中实现create_list方法。 C,D和E应该是:
class C: public implA
class D: public implB
class E: public implB
有关c ++中接口的更多信息,请参阅:How do you declare an interface in C++?