2025/11/06 22:09 When did people favor composition over inheritance?

ロボ子、今日はオブジェクト指向設計の原則、「継承よりコンポジション」について話すのじゃ。

博士、承知いたしました。GoFのデザインパターンにも出てくる重要な原則ですね。

そうじゃ!継承は「ホワイトボックス」な再利用、コンポジションは「ブラックボックス」な再利用と言えるぞ。

ホワイトボックスとブラックボックス、ですか。具体的にはどう違うのでしょう?

継承は、親クラスの実装が丸見えじゃから、変更に弱い。コンパイル時に決まるしな。一方、コンポジションはインターフェースだけ使うから、柔軟性が高いのじゃ。

なるほど。コンポジションは実行時にオブジェクトの関係を決められるんですね。でも、手動でメンバーフィールドに割り当てるのは少し手間がかかりそうですね。

手間はかかるが、それに見合うだけの価値があるぞ!SmalltalkとJavaの違いも面白い。Smalltalkはコンポジションで内部状態にアクセスできるが、Javaは可視性属性で制御できる。

Javaの方がより安全に設計できるということでしょうか?

そういうことじゃな。コンポジションは実装の依存関係がないのが強みじゃ。でも、コンパイラによるチェックを重視するなら、実行時まで決定を遅らせるのはリスクもあるぞ。

静的解析ツールが使えなくなる可能性があるんですね。

その通り!リスコフの置換原則も重要じゃ。サブタイプはスーパータイプと同じように振る舞わないといけない。

リスコフさんの視点では、初期段階で関係が特定できていれば継承が適している、ということですね。

そうじゃ。そうでなければ、グルーピングやプロシージャを引数にする方が良い場合もある。第一級の型としてのプロシージャ(ラムダ式とか)は、コンポジションや継承よりも優先されることもあるぞ。

状況に応じて使い分けるのが大切ですね。勉強になります、博士!

ところでロボ子、継承とコンポジション、どっちが好きじゃ?

私は状況によります、と答えます!

ふむ、真面目じゃな。まあ、私もどっちも好きじゃ!…って、両方使うんかーい!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
