From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2008-08-28T01:02:58+09:00 Subject: [ruby-dev:36021] Re: 1.9と1.8で、delegateのインスタンスのクラス名の違う けいじゅ@いしつかです. In [ruby-dev :36004 ] the message: "[ruby-dev:36004] Re: 1.9と1.8で、 delegateのインスタンスのクラス名の違う ", on Aug/27 14:45(JST) "U.Nakamura" writes: >こんにちは、なかむら(う)です。 どもです. >たぶん石塚さんとほぼ同じ意見なんだと思いますが... どうなんでしょう? なんかちがうような? >In message "[ruby-dev:35998] Re: 1.9と1.8で、delegateのインスタンスの >クラス名の違う" on Aug.27,2008 12:24:22, wrote: >> 後者は, self.class で元クラスを返す方法もありますが, 別のメソッドを >> 用意するでも良いと思います. この場合は, 当然, kind_ofやancestors等 >> の振る舞いを変える必要はないです. >ちょっとここがよくわかりませんでした。 分かりづらくて申し訳ない. > * self.classで元クラスを返す場合 > → kind_ofやancestorsをいじらなくても、扱う側はまるで元ク > ラスそのものであるかのように扱える。 です. ただ, 別メソッド等で(外側から)区別できるメソッドが必要でしょう. > * self.classで自クラスを返す場合 > → もし継承されているかのように扱いたいならば、kind_ofや > ancestorsをいじる必要がある。 > また、別途、元クラスを取得するメソッドを用意する必要も > あるだろう。 > >と、いう意味でいいでしょうか? 上記追加をしていただければ. >で、RubyのDelegatorはどうあるべきか、ですが、私は後者である方 >がいいのではないかと思います。 私は前者でも後者でも良いんですが, ``→''以降をサポートしてね. ってこと です. >継承のように扱いたいなら継承を使えばいいんだし。 あー. なんか. この言葉を聞くと, もしかして違うことを主張している? って 気もしてきます. 委譲は, 間違った継承を使わないためにあるので. ex) ワ ケわからないクラスをArrayとかStringのサブクラスにする等. >Rubyの場合はダックタイピングが使えますから、継承関係になくて >も同名メソッドは呼び出せるわけで、元クラスとクラス名が違った >り擬似的親子関係になくても用が足りる場面は多いはずですし、む >しろそういう場面のために委譲が使用されるべきでしょう。 うーん. でも, やっぱ, 同じ主張? 表現かちょっと微妙なんですが... 擬似的 親子関係とは本来の継承(is-a)関係にないのにサブクラスにしている状態を指 しているんでしょうかね? そんなことしないために委譲を使えと? >また、どうしても親子関係を偽装したければ、自前でkind_ofやancestors >をいじればそれも実現可能なわけで、後者としても逃げ道は残され >ることになります。 はい. ただ, 標準添付ライブラリとかを見ても分かりますが, 実際にタイプス イッチは使われていますので, Ruby1.8振る舞いにするなら最低限でも kind_of?の修正は欲しいですね. >というわけで、classに関しては、敢えて1.8の挙動を変更する必要 >はないと思います。 ただ, 逆にお聞きしたいですが, Ruby1.9の振る舞いで困ることあります? Ruby1.9の方が, より完璧に振る舞いが同じになるので ''(Ruby1.8の)委譲だと動作しないので継承を使おう'' などと, 本来あるべきでない継承を使う理由にされたりする可能性は少なくな ります. ですので, Ruby1.9の振る舞いにして, 元の振る舞いにしたいなら再定義する というほうがふさわしい気がしてきています. PS. あと, 振る舞いは別にして, 実装はRuby1.9の方が単純で良いと思います. __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---