From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2005-11-14T12:01:46+09:00 Subject: [ruby-list:41535] Re: Matrix の継承について けいじゅ@いしつかです. In [ruby-list:41529] the message: "[ruby-list:41529] Re: Matrix の継承 について", on Nov/12 16:30(JST) Shin-ichiro HARA writes: >原です。 >確かに複数の行列クラスを体系的に継承関係で構築すると破綻すると思う >のですが、ちょっとMatrixのメソッドをパクって、、という需要もあるわ >けで、実際Arrayなどでは、 > > class YaArray < Array > end > a = YaArray[0, 1, 2] > p a.class #=> YaArray > >となっています。 これは... >のように定義するのをRubyのポリシーとしてしまってもいいのでは? を持ち出すのも何ですが, 逆に禁止してくれる方が間違った利用法を防いでく れるという意味では, Rubyっぽいのでは? >いっそ、吉田さんの提案のように、コンストラクタなどのクラスメソッド >は特別な理由がない限り、 > > def Matrix.identity(n) > Matrix.scalar(n, 1) > end > >ではなくて、 > > def Matrix.identity(n) > self.scalar(n, 1) > end > >のように定義するのをRubyのポリシーとしてしまってもいいのでは? うーん. ちょこっと, サブクラスをつくると言うほど, 事情はそう簡単なでも ないのでは? というのも, Matrixにはコンストラクタと言うか, 結果としてMatrixを生成す るメソッドがたくさんあるわけですが, Matrix#+ Matrix#* Matrix#inv : class S S S#* -> S S#inv -> S となる保証は全然ないですよね? さらに, S#indentity -> S になる保証もないとうか, 存在しない場合もあるわけですよね. といことで, Matrixのサブクラスを作成する場合, ここのメソッドについてどうなるか調べ なくてはいけなくて, S#identityも調べなくてはいけないという意味では変わ りません. ということで, ちょこっと, Matrixのサブクラスをつくる と言うことはあり得ないと主張したいです. とはいえ, > def Matrix.identity(n) > Matrix.scalar(n, 1) > end を > def Matrix.identity(n) > self.scalar(n, 1) > end に, というより Matrix をはずせって言うわけですよね. def Matrix.identity(n) scalar(n, 1) end これなら, 変更してもかまいません. が, Matrix#+ -> Matrix Matrix#* -> Matrix Matrix#inv -> Matrix : に関しては, いかんともしがたいので, サブクラスの実装の手間はあまり変わ らないですが... __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---