C#の継承とコンポジション(構成)の違いをわかりやすく解説
C#におけるオブジェクト指向設計では、クラス同士の関係性を表す方法として「継承(Inheritance)」と「コンポジション(Composition/構成)」という2つの重要な概念があります。それぞれの特徴と使い分けについて、具体例を交えて解説します。
継承(Inheritance)とは
継承とは、既存のクラスのメンバー(フィールドやメソッドなど)を、新しいクラスが引き継ぐ仕組みです。このとき、元となる既存のクラスを基底クラス(ベースクラス)、新しく作成するクラスを派生クラス(サブクラス)と呼びます。
継承は「IS-A関係(〜は〜である)」を実現します。例えば、「哺乳類は動物である」「犬は哺乳類である」という関係が成り立つとき、「犬は動物でもある」と言えます。このように、階層的な関係を自然に表現できるのが継承の強みです。
具体的な例を挙げると、基底クラスとして「Shape(図形)」を定義し、そこから「Circle(円)」「Square(正方形)」「Rectangle(長方形)」などの派生クラスを作成できます。各図形クラスは共通の機能をShapeから受け継ぎつつ、独自の振る舞いを追加できます。
コンポジション(Composition/構成)とは
コンポジションは、あるオブジェクトが別のオブジェクトを内部に持つ関係を表します。特筆すべき点は、親オブジェクトが削除されると、子オブジェクトもその存在意義を失うという点です。つまり、親子のライフサイクルが密接に結びついています。
コンポジションは集約(Aggregation)の一種であり、「part-of関係(〜の一部である)」を実現します。集約との違いは、所有している側とされている側の結びつきの強さにあります。コンポジションでは所有関係がより強く、部分は単独では存在できません。
典型的な例として、「車(Car)はエンジン(Engine)を持っている」という関係があります。車が廃棄されれば、そのエンジンも一緒に破棄されるのが自然です。このように、全体と部分が一体不可分の関係にある場合にコンポジションが適しています。
コード例
以下は、CarクラスがEngineクラスを内部に保持するコンポジションの実装例です。
public class Engine {
. . .
}
public class Car {
Engine eng = new Engine();
.......
}
このコードでは、CarクラスのフィールドとしてEngineのインスタンスを直接生成しています。これにより、Carオブジェクトの生成とともにEngineも生成され、Carが不要になればEngineも運命を共にします。
まとめ
- 継承: IS-A関係を表現。「犬は動物である」のように、階層的な分類に適している。
- コンポジション: part-of関係を表現。「車はエンジンの集合体である」のように、全体と部分が一体化した所有関係に適している。
設計の際には、クラス間の本質的な関係を見極め、継承とコンポジションを適切に使い分けることが、保守性の高いコードにつながります。
-
Javaの継承の種類をわかりやすく解説!3つのパターンと具体例
Javaでサポートされる3種類の継承Javaにおける継承(Inheritance)は、既存のクラスのプロパティやメソッドを別のクラスが引き継ぐことで、コードの再利用性を高め、保守性の高いプログラムを実現する重要な仕組みです。Javaでは、主に以下の3種類の継承パターンが利用できます。1. 単一レベル継承(Single Level Inheritance)ひとつのクラスが、別の単一のクラスからプロパティやメソッドを引き継ぐ、最も基本的な継承形式です。例:クラスBがクラスAを継承する。2. 多段階継承(Multilevel Inheritance)あるクラスが、すでに別のクラスを継承しているクラス
-
Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説
本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(