C#におけるオブジェクト指向合成の資料

この資料では、C#におけるオブジェクト指向プログラミングの合成(Composition)について解説します。合成は、クラス間の「has-a」関係を実現する手法であり、継承とは異なる柔軟な設計を可能にします。


1. 合成の基本概念

1.1 合成(Composition)とは

  • 定義:
    あるクラスが他のクラスのインスタンス(オブジェクト)をメンバとして持ち、その機能を利用または拡張する設計手法です。
  • メリット:
    • 再利用性の向上: 同じ機能を持つクラスを複数の場所で再利用可能
    • 柔軟性: 実行時にオブジェクトの入れ替えが可能なため、拡張性が高い
    • カプセル化: 内部実装を隠蔽し、疎結合な設計が可能

1.2 継承との比較

  • 継承(Inheritance):
    「is-a」関係を表し、クラスが別のクラスから属性やメソッドを引き継ぐ設計手法です。
    ※注意: 過度な継承は結合度を高め、変更に弱い設計となる可能性があります。
  • 合成(Composition):
    「has-a」関係を実現し、必要な機能を持つ別のクラスのインスタンスを内部に持つことで、より柔軟かつテストしやすい設計を可能にします。

2. C#での合成の実装例

以下は、合成を利用したシンプルな例です。Car クラスが Engine クラスのオブジェクトを内部に保持し、車を動かす処理を実現しています。

public class Engine
{
    public void Start()
    {
        Console.WriteLine("エンジンが始動しました。");
    }
}

public class Car
{
    // Engineオブジェクトを内部に持つ(合成)
    private Engine engine;

    public Car()
    {
        engine = new Engine();
    }

    public void StartCar()
    {
        // Engineの機能を利用(委譲)
        engine.Start();
        Console.WriteLine("車が走り出しました。");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Car car = new Car();
        car.StartCar();
    }
}
C#

説明

  • Engineクラス:
    エンジンの起動処理を持つシンプルなクラスです。
  • Carクラス:
    Engine クラスのインスタンスをフィールドとして保持し、そのメソッドを利用して車の動作を実現しています。
    ※依存性注入などを用いることで、さらに柔軟でテスト可能な設計に改善できます。

3. 実行結果

このプログラムを実行すると、以下のような出力が得られます。

エンジンが始動しました。
車が走り出しました。

出力の説明

  1. エンジンが始動しました。
    Engine クラスの Start メソッドが呼び出され、エンジンの起動メッセージが表示されます。
  2. 車が走り出しました。
    Car クラスの StartCar メソッド内で、エンジンの起動後に車が動き出したことを示すメッセージが表示されます。

4. 応用と設計上の注意点

4.1 再利用性と柔軟性の向上

  • 複数のクラスで共通機能を提供するクラスを作成し、必要に応じて組み合わせることで、コードの重複を避けることができます。

4.2 依存性注入の利用

  • 依存性注入(Dependency Injection)を活用することで、合成による依存関係を外部から注入し、テスト容易性と設計の柔軟性を向上させることができます。

4.3 適材適所での設計手法の選択

  • 合成と継承はそれぞれメリット・デメリットがあります。設計するシステムの要求に応じて、最適な手法を選択することが重要です。

5. まとめ

  • 合成(Composition)は、 クラスが他のクラスのインスタンスを内部に持ち、その機能を利用することで柔軟かつ再利用性の高い設計を実現します。
  • 継承との違い:
    • 継承は「is-a」関係、合成は「has-a」関係を表し、目的や状況に応じて適切な手法を選択します。
  • C#における実装:
    シンプルなコード例を通じて、合成の基本的な使い方とその利点を理解できます。
  • 実行結果:
    プログラムを実行すると、エンジンの起動と車の走行開始が順に出力されます。