From: Shin-ichiro HARA Date: 2005-11-26T16:31:53+09:00 Subject: [ruby-list:41595] Re: Array#+, Array#* [Matrix の継承について] 原です。 In [ruby-list:41594] >けいじゅ@いしつかです. >>原です。 >> S + S => S >>はいいのではないか。 > >うーん. > >class Prime >とすると, > > 2 + 7 => 9 > >となり, S+S=>S を満たしていないですよね. でも, Primeは置換 >原理を満たしていますので, Integerのサブクラスとしてはそれほ >どおかしいわけではないです. あ、部分集合をサブクラスとして作る場合ですね。想定外でした。 確かにおっしゃる通りで、「+ならいいんじゃないの?」という私 の意見はだめですね。 >サブクラスが乗法に関して閉じているかどうかは, サブクラスの >作り方によりますので, 一概には言えないんじゃないでしょうか? はい。 まとめておくと A#opという演算子が A op A => A という形で定義されているとき、AのサブクラスSに対して (1) S op A => A (2) S op A => S (3) S op S => S などのopの拡張があり得るが(他にもありえるが)、どれで であるべきかはケースバイケースである。 したがって、特別な理由がない限り不用意な継承をさせないために (1)を選んでおく、ということかな。 ちなみに(3)はリスコフの置換原理に少し違反してる? >>さしあたってArray#+、Array#*については継承してもいいような気 >>がするんだけどなあ。 > >Arrayの場合ですよねぇ.... > >class S >S+S=>S > >は普通は成り立つような気がしますが, サブクラスを返すとなると: > >S+Array=>? >Array+S=>? > >については, ちゃんと考えなくてはならないし, さらには, class Tend として > >S+T=>? > >はどうする? って問題もありますし, > >やはり, 積極的にサブクラス作成を認めていないArrayとしては, >必要ならサブクラス側で考えれば? っていいたいんですが? なるほど、例えばSとしてSizedArrayなんかもあり得ますね。納得 しました。 ところでふとruby-listを「楕円」で検索したら、 [ruby-list:2455] class design から始まるスレッドを発掘しました。私も口を出していたのにすっ かり忘れている。殆ど有史以前という感じですが、「Arrayを継承 してVectorを作るぐらいだったら死んだ方がまし(意訳)」とか興 味深い発言がいろいろありました。 金光さんが「オブジェクト指向プログラミング言語Ruby」の出版を考 えた瞬間が記録されている!