互いに密接に関連する 3 つのクラスがあり、3 つすべてを同時に専門化したいと考えています。3 つの派生クラスは、スーパークラスと同じインターフェイスに加えて、派生バージョンに追加するいくつかの追加インターフェイスを使用して相互に通信する必要があります。この種の「同時派生」関係を C++ で実装するために使用できる合理的なパターンはありますか?
具体的には、グラフを表示および編集する UI コンポーネントを拡張しています。関連する 3 つのクラスがあります。
- CGraph、UI ウィジェット自体。
- データを保持し、CGraph によって操作される CSeries。
- シリーズ内の 1 つの値を表す CValue。そのリストは CSeries によって所有されます。
派生クラス 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 を使用する必要があります。