豊福です。

[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