matjuことMathieu Bouchardが、「Rubyに本物の多重継承を」と提案している([ruby-core:1378])。
基本的な主張は
というようなことなのだが、私の答えは「気持ちは分かるが賛成できない」である。
というのも、Rubyのmoduleのような制約によってMix-inを強制した方が、 クラスの階層構造のデザインがきれいになることを支援できると考えているからだ。
しかし、改めて考えると、「なぜその方がきれいになるか」とうことを上手に説明できない。
継承のラインとMix-inのラインを区別することで、単純(単一)継承のシンプルさと、 多重継承の機能の両方を実現できる、というのが一応の答えだが、本当にそうか、証拠があるか、 と問われると答えに窮したりして。
結局matjuはあまり賛成が得られなかったということで、この提案を引っ込めてしまうのだが、 将来の考察の材料にはなったと思う。
Mix-inは本当に多重継承より優れているのか
今後も考察を続けたい。
最上さんの日記で、 私が書いていることについての疑問点をリストしていらっしゃる。 分からないのは、私が書きなぐった日記を時間をかけて考察しているからではないかと(苦笑)。
これらの記事を読むと「アイデンティティがあること」と「リファレンスあるいはポインタ値があること」と「代入によってコピーが発生しないこと」がほぼ同じ事とされているように思う。しかし本当にこれらは同じことなのだろうか。これが第一の疑問点。しかもこれらがオブジェクト指向の必要条件とされている。
同じじゃないかも。私が同じでない例を思いつかなかっただけで。
これらが必要条件かというとそれは微妙で、 RubyにおけるFixnumの実装などを考えると、アイデンティティがないオブジェクト指向は不可能ではないと思います。 しかし、それはあくまでもtrivialなケースだけで、アイデンティティがない(よって副作用もない)状況で、 実用的なオブジェクト指向プログラミングは不可能ではないかというのが私の意図です。
その辺が、以前「アイデンティティ」で「副作用の全くないオブジェクト指向プログラミングというのは、なかなか考えにくい」と書いた真意なのです。
第二の疑問はこの条件を満たさなくてもオブジェクト指向と呼べる場合があるのではないかということ。例えばC++ではクラスメソッドの内部以外では一切ポインタを使わないことにしてobject.method(arguments); と言う形の呼び出しを使って全てを済ませることが出来る。可変長のものを扱わなくて良いのならクラスメソッドの内部でもポインタを一切使わなくて良い。この場合はアイデンティティはない。ポインタ値もない。代入によってコピーが発生する。でもこれでも充分オブジェクト指向ではないのか。それともなにか見落としているだろうか。
「object.method(argument);という形」がどういう形なのかいまいちよくわからないのですが、 objectというのはスタック上のオブジェクトであるということなのかな。 仮にそうだとしてもC++だとメンバ関数にはthisというリファレンスが暗黙に導入されちゃっているんで、 「ポインタ値もない」とはいえないんじゃないかと。
仮に「メンバも一切使わない」のだとすると、 それだけで実用的なオブジェクト指向プログラミングができるとは私には思えません。 つまり、「不可能」ではなく「実用的ではない」ですね。 動的結合も副作用さえも使えないわけですよね。
追記
あれ、もしかして「アイデンティティがない」って表現を、 「アイデンティティがないものがある」という意味で使ってます?
私は「アイデンティティがないものしかない」という意味で使ってます。 アイデンティティがあるものとないものが混ざっている場合には、 オブジェクト指向するのになんの問題もないので。