我有三个相互紧密耦合的课程,我想同时专注于这三个课程。这三个派生类应该使用与超类相同的接口相互通信,以及我将在派生版本中添加的一些其他接口。我可以用一种合理的模式在C ++中实现这种“同时派生”关系吗?
更具体一点:我正在扩展一个显示和编辑图形的UI组件。涉及三个类:
我计划添加派生类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
我遇到的问题是,例如,CSeries在其定义中引用了CValue:
class CSeries
{
public:
CValue & FindValue(/* stuff */);
private:
vector<CValue> m_values;
};
在CNewSeries中,它应该是CNewValue的向量,而FindValue应该返回CNewValue引用等。类似地,CGraph在其定义中引用CSeries,但CNewGraph应该使用CNewSeries。
答案 0 :(得分: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现在不会从CSeries派生。这意味着使用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 */
};
对于只有三个班级,这并不算太糟糕,但我可以想象,如果你有更多的课程需要与CSeries交谈,那么它很匆忙。