継承と構成の主な違いは、継承は既存のクラスのプロパティとメソッドを新しいクラスで使用できるのに対し、構成は関連するオブジェクト間の所有権を記述する特殊な集約のタイプであることである。
オブジェクト指向プログラミング(OOP)は、ソフトウェア開発で使用される主要なパラダイムです。
プログラマーは、オブジェクトのセットを使用してソフトウェアをモデル化することができます。
オブジェクトは、状態と振る舞いを持つ実体です。
開発者はクラスを使用してオブジェクトを作成します。
従って、クラスは設計図と言えます。
さらに、クラスはプロパティとメソッドを含んでいます。
プロパティはオブジェクトの状態を表し、メソッドはオブジェクトの振る舞いを表します。
さらに、継承と合成は、OOPに解放された2つの概念です。
継承とは何か
継承とは、すでに存在するクラスのプロパティやメソッドを新しいクラスで使用することです。
この既存のクラスを親クラス、スーパークラス、基底クラスと呼びます。
新しいクラスは、子クラス、サブクラス、派生クラスと呼ばれます。
開発者は、継承のおかげで、最初からコードを書く必要がありません。
既存のクラスのプロパティやメソッドを新しいクラスで使用することができます。
したがって、継承はコードの再利用性を向上させる。
継承には様々な種類があります。
単一レベル継承 – 例えば、2つのクラスがあるとする。
BクラスはAクラスから継承される。
多段階継承 – この継承タイプは、中間クラスが存在する。
例えば、3つのクラスがあるとします。
CクラスはBクラスから、BクラスはAクラスから継承されます。
Cはサブクラスであり、AとBはスーパークラスです。
階層継承 – クラスA、B、Cの3つのクラスがあり、クラスBとCはクラスAから継承しているため、クラスAがスーパークラス、クラスBとCがサブクラスになる。
ハイブリッド継承 – 多階層継承と多重継承を組み合わせたもの。
A、B、C、Dがクラスの場合、BとCはAから継承し、DはBとCから継承する。
アグリゲーションとは
コンポジションを理解する前に、アグリゲーションを理解することが重要です。
OOPでは、オブジェクトはメソッドを使って互いに通信する。
集約は、オブジェクト間の「has a」関係を記述する関連付けです。
2つのオブジェクトの間には依存関係はない。
たとえば、教室と生徒があるとする。
生徒のオブジェクトは、教室のオブジェクトがなくても存在することができます。
つまり、これはアグリゲーションです。
つまり、全体の外側に部分が存在しうる場合、これを集合と呼ぶ。
コンポジションとは
Compositionとは、所有権を意味する特殊な集約の一種である。
あるオブジェクトは別のオブジェクトに依存し、依存関係が存在します。
学校オブジェクトと教室オブジェクトを見てみましょう。
教室オブジェクトは、学校オブジェクトがなければ存在できません。
学校オブジェクトが破壊されれば、教室オブジェクトも破壊されます。
このように、この2つのオブジェクトの間には依存関係があるのです。
つまり、これは構図なのです。
つまり、全体の外には存在し得ない部分を構成と呼ぶのです。
継承と合成の違い
定義
継承は既存のクラスのプロパティとメソッドを使用して新しいクラスを作成する方法論であるのに対し、構成は所有権を意味する特殊な集約の一種である。
したがって、これがInheritanceとCompositionの主な違いです。
機能性
また、継承では、既にあるコードを利用することができる。
しかし、コンポジションでは、所有するオブジェクトを破壊すると、 含有するオブジェクトにも影響する。
使用方法
継承と構成のもう一つの違いは、継承がコードの再利用を可能にするのに対し、構成は関連性を表現できることである。
結論
継承とコンポジションは、OOPに関連する概念です。
継承と構成の主な違いは、継承では既存のクラスのプロパティやメソッドを新しいクラスで使用できるのに対し、構成では関連するオブジェクト間の所有権を記述する特殊な集計方法であることです。