継承よりコンポジションとは

どちらが良いという話ではない。ただし、安易に継承を多用するなという話だ。

継承が適する場面

ほぼ下記の1ケースのみ。

サブクラスがスーパークラスの全ての性質を持つ場合
  • よく言われる「is-a ならば継承、 has-a ならばコンポジション」と意味合いは同じ。
  • サブクラスは自動的に protected public 全ての振る舞いと状態を引き継いでしまうから。

コンポジション(合成)が適する場合

  • (継承の裏腹だが)単にあるクラスの一部の性質を利用したい場合
  • HOUSE に対する DOOR や FLOOR のようにコンポーネントの関係にある場合

使い分けは難しい

具体例

  • SportsCar クラスは Car クラスを継承すべきだろうか。
  • Student クラスは Person クラスを継承すべきだろうか。
  • Dachshund クラスは Dog クラスを継承すべきだろうか。

この疑問に対して

自分自身の永続的な性質

「継承」、「コンポジション」と「抽象クラス」の使い分けについて - ●前提「継... - Yahoo!知恵袋

という観点もある。つまり、

  • 人間に対する学生は、一時的な性質なのでコンポジション
  • Dogに対するDachshundはImmutableに近いので継承でも良さそう。

というような考え方だが、決定的ではなくあくまでスペクトル上の話に過ぎない。 結局最後は、目の前のアプリケーションの展望や制約に応じて自分の頭で考えるしかなさそうだ。