豊福です。 [ruby-list:18750] まつもとさん >| 逆に「多重継承だとつい複雑に書いてしまいがちだが >|Mix-in だとそうはならない」具体的な例をあげて Mix-in >|を説明して欲しい > > Ruby本、p.175図4-5と、p.178図4-9の周辺ではいかが? ダメです。:-) というか。多重継承も Mix-in も使ったことないので 実感がわきません。 多重継承によるメソッド結合の複雑化のところの 「同じメソッドが複数回実されてしまう」ですが、 例えば ReadWriteStream の initialize が ReadStream と WriteStream に super して、その二つがそれぞれ Stream に super してみたいなことでしょうか。 Mix-in だとどうなるのだろう。 ちょっとわざとらしいですが include の菱形で やってみました。 module Stream_able def foo; p "Stream_able"; end end module ReadStream_able include Stream_able def foo; super; p "ReadStream_able"; end end module WriteStream_able include Stream_able def foo; super; p "WriteStream_able"; end end class Foo include ReadStream_able include WriteStream_able def foo; super; p "Foo"; end end x = Foo.new x.foo 結果は "Stream_able" "ReadStream_able" "WriteStream_able" "Foo" Stream_able#foo は一回だけですね。 どういう流れでこう出力されるのかよくわかって ないのですが多重継承にはこの仕掛は入れられ ないのでしょうか。またこの仕掛が入れている ことによる Mix-in のデメリットはないので しょうか。 「複数回実行」以外の「クラスの挙動が予想しに くくなる」具体例とそれを Mix-in で書いたときの 例の比較などもあるともっとぴんとくると思います。 それとクジラの Mix-in の例ですが、哺乳類を主 に、海棲を従に考えていると思うのですが、別の ケースで哺乳類を従に考えることもあるかもしれない から module Mammalia にしておこうというように 何でも module になってしまわないんでしょうか。 --- 豊福 toyofuku / juice.or.jp