From: NAKAMURA Akifumi Date: 2008-06-30T08:00:12+09:00 Subject: [ruby-list:45164] Re: MySQLに書き込む前にSJISのエスケープ文字を入れる処理ってどうされてますか? a.中村です。 adgjmptw@super-r.net さんは書きました: > class Mysqlov < Mysql > def set() #とりあえずメソッド追加 > end > end > > db=Mysqlov.init() > db.set() > undefined method `set' for # (NoMethodError)\r, > 継承のやり方間違ってますか? 継承のやりかた自体はOKですが、 継承に何を期待するか?が間違ってる気がします。 以下、私はmysqlライブラリのことは知らないので 想像とか一般論とかを混ぜちゃいますが、 Mysqlovにinitというクラスメソッドが無いようなので、 (これ以外のソースは無いのだと仮定して) それを呼んでも、実際呼ばれるのは Mysqlのほうのinitメソッドだと思います。 Mysql.initは(きっとたぶん) インスタンスを生成して(そして初期化して)返すんだと思いますが、 問題はそのインスタンスのクラスが何か?です。 根本的にはinitが何をするかはライブラリ作ったかたの自由ですが、 (rubyだとnewメソッドとかには文化的な縛りがありますが、 たしかinitには無いですよね) たぶん(^^;Mysqlクラスあたりのインスタンスを生成するんだと思います。 で、その場合、こまかく言えば Mysql.initが ●いまのじぶんのクラス(つまりMysqlov)を動的にとってきて、 それのインスタンスを作る ●Mysqlクラス(きめうち)のインスタンスを作る という2つの実装というか設計が有り得ると思います。 そしてどっちを選択するかは、 これまたライブラリ作者さんしだいだと思います。 実際これは一長一短なので、設計方針しだいかなと。 多田さんが期待されたのは 動的にとってきて…のほうだと思うんですが、 実際は「メソッド無い」とか ログに出てるクラス名とか といった振る舞いから想像するに きめうちMysqlのほうになってるんだと思います。 newメソッドならruby文化に照らして 「出てきたインスタンスは 自分で書いたクラスになっててくれないと変だ!」 といえるけど、 それ以外の多くのメソッドでは どう振舞うかはライブラリの実装(設計)しだい だと思います。 少なくとも「継承したから」という理由で おのずからそうなる、というものではない のだろうと思います。 「何を期待するか」ってのは、その話です。 #ってことでいいんでしたっけ?>みなさま