From: "Dai.K." Date: 1999-10-08T12:30:33+09:00 Subject: [ruby-list:17526] Re: 動的継承 (Re: Re: 「なんでもない」値を得るには) かんだです。 matz@netlab.co.jp (Yukihiro Matsumoto)さんの書かれた、 「[ruby-list:17522] 動的継承 (Re: Re: 「なんでもない」値を得るには)」 からの引用です。 > まつもと ゆきひろです > > In message "[ruby-list:17519] Re: 「なんでもない」値を得るには" > on 99/10/08, Shin-ichiro Hara writes: > > |話は違いますが、後で継承関係をつけるという事はできないですかね。 > | > | C1 = Class.new > | C2 = Class.new > | C2.inherit C1 #=> C2 < C1 > | > |みたいな inherit を用意する。邪道ですか? > > あってはいけないとまでは思いませんが、実装の観点から言うとメ > ソッドキャッシュが効かなくなるような気がするんで、ちょっと採 > 用しにくいなあ。だれか試してみる気はありますか? これは Module::include じゃ駄目なんですか? 動的継承は、昔↓みたいなのをちょっとテストしてました:-) クラスで定義せず、モジュールで定義したメソッドは最後に include した モジュールのでオーバーライド、クラスで定義されたメソッドはモジュールで はオーバーライドされない、と。 ----------------------------------------------------------------------- module M1 def m0; "M1 "; end def m1; "M1 "; end def m2; "M1 "; end end module M2 def m0; "M2 "; end def m1; "M2 "; end def m2; "M2 "; end end class C1 def m0; "C1 "; end def m2; "C1 "; end end class C2 < C1 def m0; "C2 "; end def m1; "C2 "; end end o1 = C1::new() o2 = C2::new() p o1.m0() + "xx " + o1.m2() # "C1 xx C1 " p o2.m0() + o2.m1() + o2.m2() # "C2 C2 C1 " print "--\n" class C1; include(M1); end p o1.m0() + o1.m1() + o1.m2() # "C1 M1 C1 " p o2.m0() + o2.m1() + o2.m2() # "C2 C2 C1 " print "--\n" class C1; include(M2); end p o1.m0() + o1.m1() + o1.m2() # "C1 M2 C1 " p o2.m0() + o2.m1() + o2.m2() # "C2 C2 C1 " print "--\n" class C1; include(M1); end p o1.m0() + o1.m1() + o1.m2() # "C1 M2 C1 " p o2.m0() + o2.m1() + o2.m2() # "C2 C2 C1 "