1

私は2つの(無関係な)クラスを持っています。最初のものは「ポイント」です:

typedef std::complex<double> complex_number;

class Point
{
public:
    Point(const complex_number &affix);

    const complex_number & get_affix() const;
    void set_affix(const complex_number & new_affix);

    // etc
private:
    complex_number affix_;
};

(ちなみに、この無関係な質問をして申し訳ありませんが、型定義を配置する適切な場所はどこですか? ここは、私の point.hpp ファイルの先頭、「良い習慣」ですか?)

2 つ目は「Abstract_Vertex」です (これは、後で抽象グラフの一部になることを意図しています)。

typedef int vertex_label;

class Abstract_Vertex
{
public:
    Abstract_Vertex(const vertex_label &label);

    const vertex_label & get_label() const;
    const vertex_label & get_neighbor_label(const int &index) const;
    void set_label(const vertex_label &new_label);

    bool is_neighbor_label(const vertex_label &label) const;

    // etc
protected:
    vertex_label label_;
    std::vector<vertex_label> neighbor_labels_;
};

次に、3 番目のクラス「Plane_Vertex」(平面のどこかにある頂点) を作成します。私はそれを行うための2つの方法を考えています:

  1. 多重継承 : Plane_Vertex クラスは Point と Vertex の両方から継承し、メンバーはありません

  2. Point point_Plane_Vertex クラスは Vertex からのみ継承し、プライベートメンバーを持ちます。

もちろん、多重継承を簡単に回避してオプション 2 を選択することもできますが、私は少し良心的な C++ 学習者であり、自分の状況での「良い実践」とは何かを知りたいと思っています。

あなたの洞察に感謝します!

4

2 に答える 2

1

第三の選択肢があるかもしれません。標準ライブラリと同じようにAbstractVertex、テンプレートを作成できます。次に、グラフ ナビゲーションと汎用機能をテンプレートに実装し、ユーザーがテンプレート引数としてノードに格納する値を提供できるようにします。

デザインは妥協しているので、私の観点から主な違いを指摘します。

関連/非関連の頂点タイプ

テンプレート アプローチでは、異なるインスタンス化は完全に異なるタイプです。つまり、Vertex<int>Vertex<Point>は関係ありません。反対に、すべての頂点の上のポリモーフィック アプローチではIntVertexPointVertex... はAbstractVertexオブジェクトです。それらをコンテナに結合して接続したり、 を使用できるコードで交換可能に使用したりできますAbstractVertex。これがいずれかのアプローチの制限または利点であるかどうかは、繰り返しますが、設計上の決定です。これらのタイプを混在させる必要はないと思うので、タイプが無関係であることを好みます。

書くコード量

テンプレート アプローチでは、テンプレートを実装してからインスタンス化するだけです。ポリモーフィック アプローチでは、グラフに含めたい要素ごとに新しいクラスを提供する必要があります。

最終的にポリモーフィック アプローチを採用することにした場合 (私はそうしません)、両方の型から多重継承を使用することは避け、構成を優先します。一般に、継承はおそらくオブジェクト指向言語で最も悪用される機能であり、多くの問題を解決するために使用できます。特に、どちらの基本型も継承用に設計されているようには見えません。派生型によってオーバーライドされる機能はなく、仮想関数もありません。これらは、構成で十分な継承を悪用していることを明確に示しています。

于 2012-06-20T00:29:26.343 に答える
0

通常、多重継承を行う正当な理由がない限り、それは避けてください。

理由:

  1. ダイヤモンドの問題を回避できます。
  2. 設計をできるだけ単純に保ちます。いくつかのレベルを過ぎると、多重継承をたどって維持するのが本当に面倒になる可能性があります。
  3. 一般に、多重継承を使用していない場合は、クラスが優れた設計のSOLID原則を満たしているかどうかを確認する方が簡単です。
  4. 構成および/または集約は、通常、適切またはより優れたアプローチとして提供されます。
  5. クラスをテストする方が簡単です。

これらは、開始するのに十分なはずです。Jon Cage がリンクした投稿には、さらに多くの知恵があります。

したがって、あなたの質問に答えるには:多重継承を使用する十分な理由がないようです。コンポジションを使用します。

于 2012-06-20T00:09:21.310 に答える