継承の意味

OOの継承という機能の目的は、以下の2つあると思う。

  • Mix-in
  • グループ化


それ以外にもあるかもしれないが今のところ思いつかない。2番目のグループ化の意味は、例えば静的言語であればポリモルフィズムがそうであるし、動的言語でも例えば例外処理をオブジェクトで受け取るときに複数の種類のクラスのオブジェクトをまとめて受け取れるようにしたい場合に利用できる。Mix-inとは、私の認識だと、いわゆる集約もしくはコンポジションの機能のことを意味する。


例えばJavaなどのオブジェクト指向言語であれば、抽象クラスや具象クラスの継承は、Mix-inとグループ化の両方の機能をいっぺんに実現できる。しかし、2つの機能が入っていると機能を分離したいときに、基本的にコードを書き換えないとできない。つまり、そもそも構文上1つずつしか機能が実現できない仕様なり文法になっている言語の方がベターなのではないかと思える。


Rubyを考えてみても単一なら実装継承ができてしまうので、こういった制限はつけていない。そもそも実装継承はカプセル化を破壊するので良くないと言われているが、機能として必要なのだろうか?


RubyでもMix-inは良いとして、インタフェースみたいなオブジェクトをグループ化するだけの機能というのがあるのだろうか?あるとすれば、その1つずつの機能を実現するやり方だけでコードを書いてみるのは一つの実験であるが、Javaでインタフェースと集約だけで書いたら恐らく冗長すぎるだろうと思う。逆にJavaにMix-inみたいな機能があればどうなっていただろうか?Pythonはシンプルに実装継承しか存在しないので機能不足だが、Python 3000ではインタフェースが入るらしいので、実装継承はそのまま残しても良いがMix-inも欲しいところ。