From: Shin-ichiro Hara Date: 2000-06-12T19:25:35+09:00 Subject: [ruby-list:23166] Re: メソッドの中の動きを変える 原です。 |石橋"rubyholic"秀仁です。 |つきつめると、継承どころか Mix-in さえ「やりすぎ」だと感じる |ようになってきました。これはおおげさですが、「安易に」継承や |Mix-in の採用を決めるのは、悪い設計への落し穴だと思います。 でも、Factory Method でも、操作の切替えに継承を用いるのではないでし ょうか。実は良く分かってないんですけど Factory Method。(^^; 例えば、今回のケースでは、こんな風にするのがいいのではないでしょうか。 class Application def useDB(dbname) @db = case dbname when "Mysql"; Mysql when "Csv"; Csv end . new end def restore; @db.restore; end end class AbstractDB def restore; open; read; close; end def open;end def read;end def close;end end class Mysql < AbstractDB def open; puts "open Mysql";end def read; puts "read Mysql";end def close; puts "close Mysql";end end class Csv < AbstractDB def open; puts "open Csv";end def read; puts "read Csv";end def close; puts "close Csv";end end foo = Application.new foo.useDB("Mysql") foo.restore つまり、最初のかわたさんの |2:initilizeの時に引数を与えて,それをインスタンス変数に格納し, |  それにより使用するデータベースエンジンを決定する。 |  後はメソッド単位でそれを参照する。 の方法と、るびきちさんの | AbstractDB | / \ | Mysql Csv を合わせた感じですけど。(あるいは、Application もアブストラクトに して継承して使うとかすると @db も隠蔽できますが、、、) extend を使うと、 class Application def useDB(dbname) @db = AbstractDB.new @db.extend case dbname when "Mysql"; Mysql when "Csv"; Csv end end def restore; @db.restore; end end class AbstractDB def restore; open; read; close; end def open;end def read;end def close;end end module Mysql def open; puts "open Mysql";end def read; puts "read Mysql";end def close; puts "close Mysql";end end module Csv def open; puts "open Csv";end def read; puts "read Csv";end def close; puts "close Csv";end end ですか。こんな感じで、継承は使う時は使いますよね。ただ、使う 場所を選ぼう、ということですか。