From: rubikitch Date: 2005-11-07T13:25:07+09:00 Subject: [ruby-list:41498] Re: Matrixの継承について From: "T.Y" Subject: [ruby-list:41497] Re: Matrixの継承について Date: Mon, 7 Nov 2005 12:13:19 +0900 > エルミート行列で表現される演算子のクラスを作ろうとしていて、 > メソッドと定数をMatrixに追加したかったのが主な目的です。 > is_a Matrix として継承が自然かなと思ったのですが、まつもとさんが > 書かれたように、サブクラスを作ることが想定されていないクラスも > あるので、継承は慎重に使わないといけないのですね。 is_a? のかわりに matrix? で行列であるかどうかの判定につかうといいかも。 class Object def matrix? false end end class Matrix def matrix? true end end class YaMatrix # Matrix が用意しているメソッドを実装 # これでMatrixの置き換えとして使える # 委譲でも可。 def coerce(other) # Matrixとの演算のために変換 end def matrix? true end end > ただ、今後メソッドをオーバーライドしたくなったとき、添付ライブラリ > 既存クラスの動作を変更するのは嫌だったということはあります。 たしかにライブラリを記述する場合にはためらわれますね。 > > もし、特定の行列のみ new_method_for_yamatrix メソッドを持たせたければ、 > > extendしてしまいましょう。 > > Matrixは数みたいなものなので、特異メソッドを持たせるには > 抵抗があったのでした。 継承がだめならforwardable.rbを使って委譲を使うのもいいです。 インスタンス変数にMatrixを持たせて、そのMatrixにメッセージを投げてしまいます。 やりかたはいろいろあるんです。Rubyですから。 るびきち☆ http://www.rubyist.net/~rubikitch/