From: "中村暁史 Nakamura Akifumi" Date: 1999-11-21T08:44:48+09:00 Subject: [ruby-list:18799] Re: super お世話になっております。 A.中村です。 On Sun, 21 Nov 1999 06:02:46 +0900 Kazuhiro Yoshida wrote: >module での initialize という名のメソッドは混乱のもとだから >使わないってのはどうかな。^^; 却下っす(T_T) moduleって、「自分では子(instance)を産めないけど パートナー(それをincludeしたclass)に産ませることができる」 という、「オス」のような気がします。 「俺は子を産めないが、育てるならこんな子にしたいぜ」 って感じ。クラスはメス。オスに「子を産む能力(new)」とかを 追加するとメスになった。(生物学の説と逆なのかな(笑)) ってのはどうでもいいですが(笑)、とにかく、initialize「に」 させるべきことを追加したい場合、moduleにinitializeを 書く以外に手は無いと思います。 特定のインスタンス変数をつけ(させ)るmodule、とか。 たとえばCompositeモジュールが@parentと@childrenを付けるなど。 @parentはまだいいですが、@childrenは配列などでないと駄目なんで initializeのときに付けてあげないとしょーがない。 その場合は勿論、M#initializeの中にsuperを書くのを忘れずに。 >@s1 は M1 のものではなく,M1 を include したクラス >例えば C のものである。 # だからインスタンス変数って言うんだな その言い回しは、違うんでないでしょか。 インスタンス変数はクラスのもんじゃなくて インスタンスのものです。 #だからインスタンス変数って言うんだな インスタンスにとっては、クラスCもモジュールM1も 自分にインスタンス変数などなどの機能を 「付けさせた」親だと思えます。両親って感じ。 いずれにせよ、moduleはincludeによってクラス階層に 「挿入される」ものなので、 initializeに限らず「任意の」メソッドを、同じ名前にすること によってブロック(笑)できてしまうようです。 それを防ぐには、moduleで定義したメソッドに superを付けることで、防げるっす。 #aliasするのは「わき道にそれる」なので、aliasじゃ #望むかたちに出来ない場合もあるんじゃないかと思います。 #そういう場合は「抜け穴を掘る」superだなと。 逆にいえば、わざと名前をぶつけてsuperせずに 継承されたメソッドを潰す「当たり屋」のような(笑) moduleも作れますね。意味あるべか。 class A def aa; p "aa"; end end module M def aa; p "mm"; end end class B "aa" class C "mm" "aa"は出ない 上記で、M#aa にsuperを付けると、aaとmmの両方が 出るようになりますよね。 よだん: 以前話した某PDM環境でも、InsertClassという概念が ありました。階層の途中に後からクラスを突っ込んで メソッドもインスタンス変数も追加&変更できました。 つーか、既存のクラス階層の「途中」に後付けで Insert出来たっす。既に出来あがってしまった階層に 機能追加するときに便利。 あ。Rubyでも後からincludeって出来るんですね。 class A def aa; p "aa"; end end class B"aa" module M def aa; p "mm"; end end class B; include M; end C.new.aa #=>"mm" ただ某は、同じInsertClassを複数の個所にInsertは 出来なかったようでして、実装の「追加」には使えたけど、 実装の「共有」には使えなかったのでした(t_t)。 Rubyのmoduleは、再利用可能なInsertClassだなと いう印象を持っています。