2

作成するクラスから継承する個別の作成者クラスを使用して構築された、いくつかの複雑なクラスがあります。

一例として、順序付けされていないデータから作成されたグラフが考えられます。

class Graph{
  //....
  public:
   void showData(); 
  protected: 
    std::vector<std::pair<int,int> > mConnectedData;

}

class GraphCreator:private Graph{
  public:
    //...
    void construct();
  private:
   std::map<double,int> mSomeHelperContainer;
   //...
}

構築には、多くのヘルパー関数と、別のクラス GraphCreator に入れるヘルパー データが必要です。グラフ関連の関数も多く必要で、いずれにしてもグラフのデータが必要なのでプライベート継承を利用しています。これは決して有名な is-a 関係ではなく、プライベートな継承は一般に悪い設計のヒントと考えられているため、いくつか疑問があります: これは良いアイデアであり、ファクトリを設計する適切な方法の 1 つなのか、それとも大きな欠点があるのでしょうか。考えたことがない?そのような工場を設計するより良い方法は何でしょうか?

編集:

これまでの回答に感謝します! 現在使用されているアプローチの理由をより明確にするための追加情報。私は静的な作成方法を使用できません (Creator の状態変数が多すぎる)。別の制約があります。作成者から独立したグラフを (たとえば、ファイルからの読み取り方法と一緒に) ライブラリで他の人に提供したいのです。それらは作成者を気にする必要はありません。したがって、Graph クラス内にコードを追加するため、友人の使用についても少し確信が持てません。

4

2 に答える 2

3

これは良い方法ではありません (データを持つものからの継承はめったにありません)。

従来のアプローチは、次のいずれかです。

  • を作るGraphCreator_friendGraph
  • static BuildメソッドをメソッドとしてGraph(直接)実装する

決定は主に、「ファクトリ」をステートフルにする必要があるかどうかによって異なります。Aclassは、メソッドではできない状態を表すために使用されます。

  • したがって、状態が必要な場合は、classそれを保存する必要があるためGraphCreator、最善の策です。
  • ステートレスなアプローチの場合、staticメソッドははるかに軽量です。

未定の場合は、最も簡単な (staticメソッド) を選択し、それがどこまで進むかを確認してください:)

于 2012-06-05T12:53:05.117 に答える
2

ここから採用した経験則は

可能な場合はコンポジションを使用し、必要な場合はプライベート継承を使用してください。

「しなければならないこと」の具体例の 1 つは、継承元のクラスに、プライベート ベースを使用するために実装する必要がある仮想関数または純粋仮想関数がある場合です。継承せずに実装することはできません。

継承の使用が避けられないというあなたの説明からは見えません。したがって、合成を使用するのが最善だと思います。

于 2012-06-05T12:51:49.550 に答える