Rubyはフル機能の多重継承を持たずMix-inしかないので、世間的には単純継承言語(+α)と認知されていると思う。
が、世間での認知はともかく、Mix-inが多重継承の一形態である以上、実質的に多重継承的な使い方が出来ることは厳然たる事実だ。
多重継承のある言語としてRubyを見ると
という二点はかなり痛い。
前者は継承に参加する全クラス(モジュール)間で名称に衝突があってはいけないことを意味する。単純継承言語ではこの条件はあまり厳しくない。スーパークラスへのラインは一本しかないので調整が難しくないからだ(にも関らずSmalltalkではインスタンス変数はクラスごとに独立だったはず)。しかし、多重継承言語では継承してくるクラス(群)が独立で調整が効かない場合があるので、この制限は厳しい。この点ではクラス名を明示する必要があるC++や名称変更機能があるEiffelの方がはるかに優れている。
っていうか、クラスをモジュールとして考える(OOSC的)立場からは C++ってかなり良い言語なんじゃないかなあ。MeyerはC++大嫌いみたいだけど。
意外なことにCLOSでは(少なくとも標準のMOPでは)スロットの名称重複は継承優先順位の高いものだけが優先になり、解消の余地がない。
後者は局所的なサブルーチンとして使おうと思ったprivateメソッドがよそのクラスのpublicメソッドと名称が重複していた場合、現状では上手な解決策がないことが問題だ。 Rubyには原始的なaliasとundefがあるが、この問題はこれらでは解決できない。
で、だ。
どちらの問題にも解決のアイディアはあるのだが、効率と互換性の両方に懸念があるのだな。
詳細は後日。
Joel on Softwareサイトの掲示板への投稿。 Railsの気に入らない点について。
書いた人は「a Hack」さんで、あちこちで誤解されているようだがJoelではない。
気に入らない点は以下の通り。
ただし、「気に入らない」と文句を言いながらも、その実は「I only say all this because Rails is the first framework worth criticizing.」であるとも述べている。
これに対して、DHH本人が反応している。こまめだね、彼も。