合成と継承

継承はis-a関係の時に使う。

ベースとなるクラス「箱クラス」があったとき、箱クラスを継承して「フタが開く機能」と「大きな音が鳴る機能」のついた「びっくり箱クラス」を作成する。この時、「びっくり箱 is 箱」だから継承しても良い。

鍵のついた「セーフティボックスクラス」を作りたいとき、「フタが開く機能」の実装がダルくて、既にある「びっくり箱クラス」を継承してセーフティボックスクラスを作成すると「セーフティーボックス is not びっくり箱」なので継承しない方が良い。

なぜ「is-a」関係じゃないと継承しない方が良いのかというと、親クラスの挙動を変えるとサブクラスの挙動が変わるからで「フタが開く速度」がびっくり箱クラスの内部パラメータに依存しているとすると、人間をもっと驚かすために後から「フタが開く速度」をものすごく速くしたとき、セーフティーボックスの開く速度もものすごく速くなってちょっと怖い。親クラスの挙動を変えるとサブクラスの動作が予期しないものとなる問題を脆弱な基底クラス問題とか言う。

フタが開く機能の実装が本当にダルいなら、セーフティボックスクラスは箱クラスを継承し、Mix-inやトレイトを使って合成(コンポジション)しよう。