Part16:続・クラス

絵里「前回の続きいくわね」
真姫「クラスの定義まではできてたわよね」
絵里「今回は継承よ。前回までのが理解できてれば、そんなに難解じゃないと思う」

絵里「前回のIdolクラスを、ちょっと説明用に拡張したのがこれ。このコードは大丈夫よね?」
にこ「前回やった内容じゃない」
絵里「そう。じゃあ、これはアイドル一般を表すクラスで、μ’sでもA-RISEでも765プロでもこのクラスで扱えるんだけど」
にこ「765プロ」
絵里「・・・扱えるんだけど、アイドルっていろいろあるし、それぞれ独自の属性情報とかあるじゃない」
真姫「要は、このIdolクラスが汎用的すぎるってことよね」
絵里「そう。だから、これをもっとあるカテゴリに特化させれば、さらに便利になるのよ」
にこ「そこでSchoolIdolクラスが必要になるわけねっ!」
絵里「ハラショー!それよ、私たちは、スクールアイドルであることにこだわりたい!」
真姫「・・・継承ってことは、なんかIdolクラスを使うのよね?」
にこ「真姫、冷めてるわね・・・」
絵里「スクールアイドルならではの要素って何かしら?」
真姫「それは、学校に所属していることと・・・」
にこ「ラブライブに出場できるにこ☆」
絵里「じゃあ、それでやってみましょうか」

絵里「class SchoolIdol(Idol)は、Idolクラスを継承してSchoolIdolクラスを定義してる、って意味」
真姫「コンストラクタに引数が増えてて、学校名と学年はselfに設定してて・・・元々あった3つは、親の__init__に渡してあげればいいのね?」
絵里「そうね。そうすると、Idolのコンストラクタが実行されてしかるべく初期化してくれるから」
にこ「introduceの中身が変わってるけど、SchoolIdolの方のintroduceが実行されるのね」
絵里「上書きみたいな感じになるわ。もちろん、インスタンス作るときにIdol(...)で作ったインスタンスは、Idolのintroduceが実行されるけど」
真姫「loveliveは新しい関数ね。これはIdolのインスタンスからは使えないのね」
絵里「もちろん。SchoolIdolにしかない関数だから。けど、コードの上ではIdolにしかないsingとdanceは、SchoolIdolでも使えるわ」
真姫「・・・それで継承、なわけね」
絵里「SchoolIdolからIdolは見えるけど、IdolからSchoolIdolは見えない、ってところかしら。拡張とか特化とかいう言い方もするわ」
にこ「分かった、つまりIdolとの差分だけ書いてるってことね!」
絵里「Idolを基底にしつつ、必要な部分だけSchoolIdol仕様に書き換えてる。まさに差分よ」

絵里「継承関係を持つクラスは親子関係で、親(Idol)を子(SchoolIdol)のスーパークラス、子を親のサブクラスと呼ぶわ」
真姫「親は子の影響を受けない、ってのは、μ’sを見てると違う気はするけど」
絵里「少し難しくなるけど、is-aの関係とも言うわね。SchoolIdol is a Idolとか。実装上はたしかに差分プログラミングなんだけど、設計上はこういう意味をちゃんと考えないとろくなものが出来上がらないわ」
真姫「is-aって方向があるのよね?Idol is a SchoolIdolだと成り立たないもの」
絵里「UMLのクラス図とか書くと分かりやすいんだけど、めんどくsおっと書く場所がないから」
にこ「ちょっと!今めんどくさいって言った!?」
絵里「・・・てへっ♪」
にこ「まったく、絵里らしくもない・・・」
絵里「こほん。子 is a 親、よ。他にもhas-aとかpart-ofとかあるけど、その辺はほんとに自習!」

絵里「クラスについてはこんなところかしら。オブジェクト指向プログラミングの本質は奥が深いから、ここではPythonの文法紹介に留めておいたけど」
真姫「まあ、いいんじゃない。話し出してもきりがないし、その筋の本でも読んでもらえば」
にこ「次回真姫だけど、何やるの?」
真姫「リスト関係で補足したいことがあるから、そのあたりを話すわ」


LINEで送る
Pocket


返信を残す

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