継承よりコンポジションとは
どちらが良いという話ではない。ただし、安易に継承を多用するなという話だ。
継承が適する場面
ほぼ下記の1ケースのみ。
サブクラスがスーパークラスの全ての性質を持つ場合
- よく言われる「is-a ならば継承、 has-a ならばコンポジション」と意味合いは同じ。
- サブクラスは自動的に
protected
public
全ての振る舞いと状態を引き継いでしまうから。
コンポジション(合成)が適する場合
- (継承の裏腹だが)単にあるクラスの一部の性質を利用したい場合
- HOUSE に対する DOOR や FLOOR のようにコンポーネントの関係にある場合
使い分けは難しい
具体例
SportsCar
クラスはCar
クラスを継承すべきだろうか。Student
クラスはPerson
クラスを継承すべきだろうか。Dachshund
クラスはDog
クラスを継承すべきだろうか。
この疑問に対して
自分自身の永続的な性質
「継承」、「コンポジション」と「抽象クラス」の使い分けについて - ●前提「継... - Yahoo!知恵袋
という観点もある。つまり、
- 人間に対する学生は、一時的な性質なのでコンポジション。
- Dogに対するDachshundはImmutableに近いので継承でも良さそう。
というような考え方だが、決定的ではなくあくまでスペクトル上の話に過ぎない。 結局最後は、目の前のアプリケーションの展望や制約に応じて自分の頭で考えるしかなさそうだ。