避免在类层次结构中使用冗余代码

时间:2014-05-03 21:15:02

标签: c++ design-patterns inheritance

我有一个特定的情况(在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;
}

我能想到的唯一方式,我不需要在所有CD和其他类似的类中重复上述代码行,是创建一个实现X的类A,并使所有这些都执行多重继承。也就是说,

class X: public A{
    VectorList* create_list(){
      return new VectorList;
    }
};
class C: public A, public X;
class D: public B, public X;

然而,这会产生钻石继承问题,这意味着我必须使用虚拟继承。但我明白这不是一个好的设计。

还有其他选择吗?

1 个答案:

答案 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++?