C#におけるコンポジションとアグリゲーションの違いを徹底解説
コンポジション(Composition)とは
コンポジションは、オブジェクト間の強い「全体-部分」の関係を表す概念です。最大の特徴は、親オブジェクトが削除されると、その子オブジェクトも同時に破棄されるという点にあります。つまり、子オブジェクトは親オブジェクトなしには独立して存在できません。
コンポジションはアグリゲーションの特殊な形であり、「part-of(部分である)」という関係を表現します。
分かりやすい例として、「車(Car)はエンジン(Engine)を持っている」という関係が挙げられます。車が廃車になって破棄されれば、そのエンジンも一緒に破棄されるのが自然です。
public class Engine {
. . .
}
public class Car {
Engine eng = new Engine();
.......
}アグリゲーション(Aggregation)とは
一方、アグリゲーションはC#においてオブジェクト間の方向性のある関連を表します。全体と部分の関係ではあるものの、親オブジェクトが削除されても子オブジェクトは独立して存続できる点が、コンポジションとの大きな違いです。
典型的な例として、「従業員(Employee)と住所(Address)」の関係があります。従業員は住所情報を持っていますが、従業員が退職・削除されても、住所そのものは他の用途で引き続き利用できます。
また、「1人の従業員は1つの部署(Department)に所属するが、1つの部署には複数の従業員が在籍する」といった一対多の関連も、アグリゲーションによって表現されます。
public class Address {
. . .
}
public class Employee {
private Address addr;
public Employee(Address addr) {
this.addr = addr;
}
. . .
}両者の違いのまとめ
| 項目 | コンポジション | アグリゲーション |
|---|---|---|
| 関係の強さ | 強い所有関係 | 比較的弱い関連 |
| ライフサイクル | 親の削除とともに子も破棄される | 親が削除されても子は独立して存続 |
| 具体例 | 車とエンジン | 従業員と住所/部署と従業員 |
このように、両者はどちらも「全体と部分」の関係をモデル化する手法ですが、子オブジェクトの生存期間が親に依存するかどうかが本質的な違いです。設計時にこの違いを正しく見極めることで、より保守性の高いオブジェクト指向プログラムを実現できます。
-
C#のクラスと構造体(struct)の違いを徹底解説
構造体(Struct)とは C#において、構造体(structure)は「値型」に分類されるデータ型です。関連性のあるさまざまな型のデータを、ひとつの変数でまとめて扱えるようにするための仕組みです。構造体を作成するには、structキーワードを使用します。 構造体を定義する際には、structステートメントを使います。このステートメントによって、プログラム内で複数のメンバーを持つ新しいデータ型が定義されます。 クラス(Class)とは クラスを定義するということは、あるデータ型の「設計図」を定義することを意味します。クラス定義はclassキーワードで始まり、その後にクラス名が続き、波括弧({
-
C#における関連・コンポジション・集約の違いをわかりやすく解説
C#における関連(Association)とは関連(アソシエーション)は、C#においてオブジェクト同士の関係性を定義する基本的な概念です。オブジェクト間には、「1対1」「1対多」「多対1」「多対多」といったさまざまな関係を持たせることができます。たとえば、1人の従業員(Employee)は複数のプロジェクトに関連付けられる一方で、1つのプロジェクトにも複数の従業員が参加できます。これは典型的な「多対多」の関係です。C#におけるコンポジション(Composition)とはコンポジション(合成)は、親オブジェクトが削除されると、それに属する子オブジェクトも存在を失うという、非常に強い依存関係を表し