2012-10-04 46 views
2

我有三個彼此緊密耦合的類,我想同時專門化所有三個類。這三個派生類應該使用與超類相同的接口相互交談,另外還要添加一些其他接口,我將在派生版本中添加這些接口。有沒有一種合理的模式可以用來在C++中實現這種「同時派生」關係?如何在C++中同時子類化幾個類?

更具體地說:我正在擴展顯示和編輯圖形的UI組件。有三類涉及:

  • CGraph,UI部件本身; CSeries,它保存數據並由CGraph操作;
  • CValue,表示系列中的一個值,其列表由C系列擁有。

我計劃添加派生類CNewGraph,CNewSeries和CNewValue(佔位符名稱)。

CGraph  ---views/edits---> CSeries  ---owns list of---> CValue 
^       ^       ^
    | is-a       | is-a       | is-a 
    |        |        | 
CNewGraph ---views/edits---> CNewSeries ---owns list of---> CNewValue 

那種問題,我碰到這個是C系列,例如,是指CValue在它的定義:

class CSeries 
{ 
public: 
    CValue & FindValue(/* stuff */); 
private: 
    vector<CValue> m_values; 
}; 

在CNewSeries,這應該是CNewValue的載體,而是和FindValue應該返回一個CNewValue引用等。同樣,CGraph在其定義中引用CSeries,但CNewGraph應該使用CNewSeries。

回答

0

一種可能性是根據值類型對CSeries進行模板化。然後,您可以創建派生類來指定要使用的特定值類型,如果不需要其他成員,甚至可以創建typedef。

template <typename T> 
class CSeriesBase 
{ 
public: 
    T & FindValue(/* stuff */); 
private: 
    std::vector<T> m_values; 
}; 

typedef CSeriesBase<CValue> CSeries; 

class CNewSeries : public CSeriesBase<CNewValue> 
{ 
    /* additional members */ 
}; 

然而,這打破了繼承關係,所以現在CNewSeries不從C系列派生。這意味着使用CSeries的其他任何東西都無法無縫地使用CNewSeries。特別是,CGraph也需要模板化,這次是系列類型。

template <typename T> 
class CGraphBase 
{ 
public: 
    void SetSeries(T * pSeries); 
private: 
    T * m_pSeries; 
}; 

typedef CGraphBase<CSeries> CGraph; 

class CNewGraph : public CGraphBase<CNewSeries> 
{ 
    /* additional members */ 
}; 

只有三個班,這是不是太糟糕了,但我能想象它越來越繁瑣着急,如果你有更多的類需要去跟C系列。

相關問題