From: matz@... (Yukihiro Matsumoto) Date: 1998-02-09T12:23:03+09:00 Subject: [ruby-list:6347] Re: ruby's design policy (Re: I'd like to su bscr ibe this ML) まつもと ゆきひろです In message "[ruby-list:6341] Re: ruby's design policy (Re: I'd like to su bscr ibe this ML)" on 98/02/09, 助田 雅紀 writes: | |助田@ちょっと反応が遅れましたです。 |Mix-in は、1つの具象クラスに複数の抽象クラス(=Module)を多重継承 |する機能と考えれば、C++ で、(複数の)抽象クラスと1つ以下の具象 |クラスを多重継承させる場合と、同じじゃないのという気がして「ほと |んど変らん」という風に思っている訳です。 うーん,Mix-inは「多重継承で出来ないことをできるようにするツー ル」ではなく,「多重継承で出来ることのサブセット」である,と いうことについては認識していただけているでしょうか.そういう 意味で,「Mix-inは1つの具象クラスに複数の抽象クラス(=Module) を多重継承する機能」であり,「C++ で、(複数の)抽象クラスと 1つ以下の具象クラスを多重継承させる場合と同じ」です. |多重継承では無く、Mix-in を採用した積極的なメリットってあるんだ |ろうかという疑問が、根底にあるんです。 |決して、Mix-inが駄目で、多重継承が良いと言っている訳ではないです。 |多重継承を採用しないで、Mix-in という方法を採用した理由が知りたい |のです。 まず,繰り返しになりますが,Mix-inは多重継承でできないことを 実現するものはなく,多重継承のサブセットです.で,なぜサブセッ トにしたのか,という話ですが,まず多重継承の問題からお話しま しょう. 多重継承にはいくつか問題があり,大きく分類すると (1) モデルが複雑になる(継承関係が属性の付加やis-a関係な ど様々な目的で使われてしまう) (2) 独立に開発されたメソッド,属性の間で名称重複が起きる というものがあります.しかし,だからといって多重継承をあきら めると継承階層を越えた実装の共有が出来なくなります.これはつ らい. で,多重継承の経験が豊富なlisp界では昔からMix-inという手法が 使われていました.どのようなものであるかという説明は繰り返し ませんが,これはメインの継承以外の継承関係は「性質の付加」と いう使い方しかしない,という意味になります. ちなみに,rubyでは2の方に対するアプローチはあっさりあきらめ てます. さて,rubyでMix-inを採用した理由は * 多重継承があれば,それを使ってしまうから 複数のクラスに対してis-a関係を持つ設計は間違ってます(注: まつもとの主観です).しかし,多重継承を持つ言語が増えて 来た現在,そのようなことを深く考えないで多重継承を使う人 はますます増えるでしょう.rubyではいっそのことそのような 設計をやろうと思ってもできないようにしてしまうことで,苦 痛を軽減しようと考えました. * 多重継承の(1)の問題を解決させる方法としてMix-in以外の方 法が知られていないから rubyは採用していないものの静的型言語では2に対する解決策 はかなり知られてきています.しかし,1の問題に対する言語 からのサポートはほとんどありません.rubyはそれらの言語と は違ったアプローチをとることを望みました. * Mix-in手法の知名度が低いから 今後rubyを使う人が沢山になれば,「自然にMix-inを使える人」 も増えて来ると思います.それはオブジェクト指向プログラミ ング全体に対する貢献になると思います. です. まつもと ゆきひろ /:|)