もりきゅうです。ちょいと長文。

中村暁史 Nakamura Akifumi さんは書きました:
>特定のインスタンス変数をつけ(させ)るmodule、とか。
>たとえばCompositeモジュールが@parentと@childrenを付けるなど。
>@parentはまだいいですが、@childrenは配列などでないと駄目なんで
>initializeのときに付けてあげないとしょーがない。
>
>その場合は勿論、M#initializeの中にsuperを書くのを忘れずに。

あ,そうかあ。ちょいと試作してみましたが..

-- composite.rb
module Composite
  def initialize(*args)
    super
    @children = []
    print "composite #{type} inited\n"
  end
  def add(child)
    @children.push child
    print "added #{child}\n"
  end
end

class Widget
  def initialize(gc) print "widget #{type} inited\n" end
end

class Window
  include Composite
  def initialize(gc, width, height)
    super
    print "window inited\n"
  end
end

class Frame < Widget
  include Composite
  def initialize(gc, caption) super gc end
end

class Button < Widget
  def initialize(gc, caption, width, height) super gc end
end

class GraphicContext
end

gc = GraphicContext.new
win = Window.new gc, 320, 200
frame = Frame.new gc, 'customize'
btn = Button.new gc, 'ok', 40, 20

win.add frame
frame.add btn
-- 結果
composite Window inited
window inited
widget Frame inited
composite Frame inited
widget Button inited
added #<Frame:0x9e53c>
added #<Button:0x9e514>
--
挙動の考察
1.  Window.new で Window.initialize が呼ばれる
2.  Window.initialize での super は Composite.initialize を呼ぶ
3.  Composite.initalize での super は..あれ? どうなるんじゃあ^^;

新たな謎を呼んでしまいましたね。^^;;;


>>@s1 は M1 のものではなく,M1 を include したクラス
>>例えば C のものである。 # だからインスタンス変数って言うんだな
>その言い回しは、違うんでないでしょか。
>インスタンス変数はクラスのもんじゃなくて
>インスタンスのものです。
>#だからインスタンス変数って言うんだな

はうん,そうでした。私の表現は不適切でした。

----
Kazuhiro Yoshida  moriq.kazuhiro / nifty.ne.jp