コンポジション

composition.png

継承よりも好んですべきもの[2]
具体的には、どんなきに継承で、どんな時にコンポジションすればいいの?についてはこちら→継承かコンポジションか?
元オブジェクトとライフサイクルが一致する、より強い集約[6]
has-a関係である。[2]

UML図

定義

オブジェクトをまとめる、あるいは合成することによって、より複雑な新しい機能を得ることができる。
オブジェクトコンポジションは、合成の対象となるオブジェクトが的確に定義されたインタフェースを有することを必要とする。
この再利用の形式はブラックボックス再利用と呼ばれている。1
なぜなら、オブジェクトの内部の詳細は見えないからである。[1]

良いところ(継承に比べて)

オブジェクトが他のオブジェクトに対する参照を実行時に獲得することにより、動的に定義される。
合成の際には、オブジェクト同士がお互いのインタフェースを考慮することが必要となる。
言い換えれば、1つのオブジェクトを他の多くのオブジェクトとともに使えるように、注意深くインタフェースを設計することが要求される。
しかし、その分ご利益もある。
オブジェクトはインタフェースを通してのみアクセスされるので、カプセル化の概念を壊すことがないのだ。[1]
私は、「インタフェースを通してのみアクセス」なんてしてないけど、使い方間違ってたかな。
同じ型を持つ限り、オブジェクトを実行時に置き換えることもできる。
さらには、オブジェクトのインタフェースによってオブジェクトを実装できるので、実装依存度は低くなる。
オブジェクトコンポジションに基づく設計の場合は、オブジェクトの数は多くなる(たとえ、クラスの数が少なかったとしても)
そして、システムの振る舞いは1つのクラスの中で定義されるのではなく、オブジェクト間に依存したものになる。

使いどき

「元オブジェクトが消えたら消えるオブジェクトへの集約」を表現したいときに使う。


inheritance

サポートサイト Wikidot.com inheritance