まだまだオブジェクト指向を極めたわけではないのですが、最近気になったこと。
オブジェクト指向の継承はメソッドを使いまわすためにあるのではないということです。
Foo
というクラスがあって、Bar
というクラスがFoo
を継承(inherit)しているとする。つまり、Bar is a Fooとなっている。
このとき、Bar
に求められるのは、Foo
と同じメソッドを持つということだけではない。メソッドの動作は変えても良いが、意味は変えてはならない。プログラム内でFoo
クラスを使っているところをBar
に置き換えても、Foo
を使っているつもりで動作しなければならない。
これを守ろうと思ったら、継承はむやみにできなくなると思うです。
ただメソッドを使いまわしたいだけなら継承ではなくて、委譲(delegate)をするべきなのです。例えば、Foo
を継承したBar
というクラスがあったとして、他にFoo
を継承したクラスBaz
が欲しい時にBar
のメソッドを使いまわしたいとしよう。このとき、Bar
をBaz
に置き換えることができないなら、Baz
はBar
を継承してはいけない。Baz
は内部変数としてBar
を持って、適宜Bar
のメソッドを呼び出すべき。
○○原則という名前がついていそうなものですが、私は知りません。当たり前すぎてついていないのかな?しかし、浸透していないように思う。
2016-04-10
関連する気付きについて書きました。