20

構成の設計が委任とどのように異なるかなど、実装に関して何か違いはありますか。たとえば、以下のコードは委譲を行っているように見えます。これは、ユーザーが b を使用せずに構成されたオブジェクト (つまり "a") にアクセスできないためです。したがって、ユーザーはクラス b のインターフェースを呼び出してから、「クラス b」が「クラス a」の適切なインターフェースを呼び出して委任する必要があります。これは理にかなっていますか?

Class A {
friend class B;
private: 
A(){}; //dont want user to instantiate this class object since it wont sense without any context. Just like a room with no house.
void PrintStructure(){};
};

Class B{
public:
void PrintStructure(){a.PrintStructure();} //delegate

private:
A a; //composition
};
4

3 に答える 3

40

「コンポジション」という用語は通常、オブジェクト モデリングの用語で「has-a」関係の表現として使用され、関連付けの形式です (もう 1 つは集約です)。これは通常、「継承」(「is-a」関係) と対比されます。そう:

コンポジションとアグリゲーションの違いは何ですか? 構成とは、子が親のコンテキストなしでは存在できないことを意味します。

たとえば、家には 1 つ以上の部屋があります。それが合成関係です。家を削除すると、部屋もなくなります。House には、Person のインスタンスである多数の居住者もいます。それらの人々はその家の文脈の外に存在するため、それは集約関係です。

委任は、実装の詳細にすぎません。クラスには、その状態と動作を記述するパブリック インターフェイスがあります。それがどのように実装されているかは関係ありません。他のオブジェクトに委任することも、委任しないこともできます。

例の A と B の両方が同じ外部インターフェイスを持っていることに気付くでしょう。次のようなことを行うのがより一般的です。

// this represents an interface
class A {
public:
  virtual void printStructure() = 0;
}

具象クラスを使用:

class ConcreteA : A {
public:
  virtual void printStructure() { ... }
}

class DelegateA : A {
public:
  DelegateA(A& a) { this.a = a; }
  virtual void printStructure() { a.printStructure(); }
private:
  A a;
}

おそらく C++ の構文エラーで申し訳ありません。私は少し錆びています。

于 2010-01-26T02:46:42.397 に答える
11

私が見るいくつかの違いがあります:

  • 委任には、メソッドの再エクスポートが含まれます。コンポジション関係では、内部オブジェクト メソッドは非公開でのみ使用でき、再公開することはできません。
  • コンポジションは通常、オブジェクトのライフサイクルに影響を与えるある種の所有権のセマンティクスを意味します。親オブジェクトは子を「所有」しており、子が単独で存在する理由はあまりありません。委任には、この意味はありません。

表示するコードは、委任と関連付けを使用します。関連付けは合成である可能性がありますが、より広いコンテキストまたはオブジェクトに関するより多くの情報がなければ、それを伝えるのは困難です (関連付けが合成になると、非常に微妙で主観的なものになる可能性があります)。

于 2010-01-26T02:39:44.777 に答える
5

コンポジションとは、オブジェクト間の関係に関するものです。

委任とは、あるオブジェクトから別のオブジェクトに作業を渡すことです。

これらは実際には異なる (ただし関連する場合もある) 懸念事項です。

あなたが持っているのは、Aで構成されたBです(BはAを指します)。B はまた、その 1 つのメソッドを A に委任します。

しかし、B による A の使用は非公開 (B のブラック ボックス内に完全にカプセル化されている) であるため、B による A の使用を「構成」とは呼びません。クラス A が B からアクセスできる場合にのみ、「構成」を使用します。ここで重要なのは、B の論理モデルに A が「含まれている」かどうかです。

あなたの場合、B は A に関して実装されています。これは実装の問題であるため、B の論理モデルの一部ではないと見なすことができます。つまり、A について話したり気にしたりすることなく、B について知的に話すことができます。

とはいえ、これは PHB と UML モデリング ツールにとってのみ重要です。または、デザイン パターンを勉強している場合。私はそれにあまり夢中になりません。

[PHB => とんがり髪のボス]

于 2010-01-26T03:45:45.647 に答える