Part14:モジュール

ルビィ「前回までで、ヨハネちゃんがクラスの話をしてくれたよね。それと関わる形で、機能の共通化をする仕組みとして用意されているのがモジュール」

ルビィ「ヨハネちゃんが見せてくれたコードでは、SchoolIdolはIdolを継承している、つまりスクールアイドルはアイドルであるというis-aの関係だったよね」
ヨハネ「そうそう。ちゃんと覚えているわね」
ルビィ「それで、singとかdanceとかのメソッドはIdolクラスに定義しておけば、SchoolIdolでもProfessionalIdolでも使えるという話でした」
マル「うん、覚えてる」
ルビィ「なんだけど、歌を歌う人ってアイドルだけじゃないよね」
マル「まあ、プロの歌手から生主までいっぱいいるな」
ルビィ「そういう人たちってIdolのサブクラスにはならないから、Idolに定義されたsingメソッドは使えないよね」
ヨハネ「・・・なるほど、そういう話ね」
ルビィ「そう。継承だけだと、再利用の範囲は限られちゃうの。言語によっては多重継承とかできるけど、Rubyではそれができないから、代わりにモジュールをmix-inするんだ」

黒澤ルビィ Singing!!
黒澤ルビィ Dancing!!
LiSA Singing!!

ルビィ「まず、分かりやすくするためにクラスの継承関係はなくしてます。で、SchoolIdolと、歌手を表すSingerの2つのクラスを用意したよ」
ヨハネ「Singerは歌うだけの人ね」
ルビィ「うん。で、前はIdolにsingdanceがあったけど、それもなくしました。代わりに、SingableとDancableっていう2つのモジュールを用意しました」
マル「一番上の2つだな」
ルビィ「それぞれ、singメソッドとdanceメソッドを持ってるよね。で、SchoolIdolとSingerのクラス定義の中で、それをincludeしてあげます」
ヨハネ「SchoolIdolは両方、SingerはSingableだけincludeしてるのね」
ルビィ「そうすると・・・SchoolIdolのインスタンスであるルビィは、singdanceができるようになります。Singerは、じゃあLiSAさんは、Singableをincludeしてるからsingができるね」
ヨハネ「includeしたモジュールのメソッドが使えるようになるっていうことね」
ルビィ「これなら、多重継承問題も解決だよね」

ルビィ「これは、クラス単位でmix-inしてるパターンだけど、例えば歌手でも踊れる人いるよね」
マル「LiSAさんの富士急ハイランドのライブ見に行ったけど、あれはすごかったずら・・・」
ルビィ「それじゃあ」

LiSA Singing!!
LiSA Dancing!!

ルビィ「こうやると、LiSAさんにも踊ってもらえるようになるよ」
ヨハネ「extendでオブジェクト単位で拡張してるのね。確かにこれなら、個人差とかまで表現できるわね」


ルビィ「継承を使わなくても、こんなふうにクラスを拡張できるんだよ。継承を使うかmix-inを使うかは、状況に応じてよく考えて決めてね」
ヨハネ「継承関係は1つだけだものね・・・なかなか難しいわね」
ルビィ「一般に、is-aの関係は継承、has-aとかpart-ofの関係はmix-inって言われてるから、基準はそれかな」

ルビィ「というわけで、最終回でした」
ヨハネ「まあ、私たちの顔見せとしてはこんなものかしらね」
マル「Railsとか、需要あるのかな・・・」
ヨハネ「まあ、需要がありそうなら改めてやればいいじゃない」
マル「ま、それもそうか」

ルビィ「じゃあ・・・3人ともキャラ不安定でごめんなさいでしたっ!黒澤ルビィと」
マル「なんか全然おっとり系じゃなかった国木田花丸と」
ヨハネ「安定と安心の堕天使ヨハネでしたっ!」
マル「こら、最後くらいちゃんと名乗るずら!」
ヨハネ「あら、いいのかしら?このヨハネが真名を解放したらどうなるか・・・」
マル「その設定もういいから」
ヨハネ「な、なにが設定よ!これはそんなんじゃなくて・・・」

ルビィ「2人とも、喧嘩するほど仲がいいんだよ♪」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です