Part13:続・クラス

ヨハネ「今回は引き続きクラスについて見ていくわ。継承といって、あるクラスの定義内容を他のクラスが受け継ぐことで、クラスを拡張・特化させていくことができるの」

ヨハネ「継承を用いる際の考え方は2つあるわね。1つは共通する機能を1箇所にまとめて、差分だけを実装した派生クラスを作っていく差分プログラミングの考え方。もう1つは、抽象度の高いクラスと低いクラスで階層関係を作って現実を的確にモデリングしようみたいなオブジェクト指向原理主義的な考え方」
ルビィ「よく、わかんないんだけど・・・」
ヨハネ「哲学的な話は置いておきましょう。例によってコードを見てもらうわ」

浦の星女学院スクールアイドルグループAqoursの黒澤ルビィ、15才です!
346PRO所属、New Generationsの島村卯月、17才です!
黒澤ルビィ Singing!!
島村卯月 Singing!!
島村卯月 Talking!!

ヨハネ「ちょっと長いけど・・・クラスの定義が3つあるわね。意味合いとしては、アイドル全般、スクールアイドル、プロのアイドルよ」
マル「IdolとSchoolIdolとProfessionalIdolだな。けど、class SchoolIdol < Idolって何してるずら?」
ヨハネ「それが継承関係を表す記述よ。SchoolIdolクラスはIdolクラスを継承している、っていう意味」
ルビィ「そこで継承が出てくるんだ。でも、それってどういうことなの?」
ヨハネ「概念的には、SchoolIdolはIdolをより狭い範囲に特化したものと捉えられるわ。SchoolIdol is a Idolは成り立つけど、逆は成り立たない関係」
ルビィ「・・・」
ヨハネ「まあ、よく分からないわよね。プログラムで見ると、SchoolIdolはIdolの機能を全て利用できて、なおかつ独自に機能を追加したり、Idolの持っている機能を変更したりできる、ということ」
マル「そっちの方が考えやすいな」

ヨハネ「この例だと、まずIdolの定義は問題ないわよね。で、SchoolIdolを見ると、@schoolっていうIdolにはなかったインスタンス変数が増えているのは分かるかしら?」
ルビィ「うん。initializeintroduceで使ってるやつだよね」
ヨハネ「それが、SchoolIdolがIdolに対して追加した機能の1つ、と捉えられるわ。それを利用して、introduceの内容も上書きしている」
ルビィ「ふむ、ふむ・・・」
ヨハネ「一方で、Idolにあるsingdanceメソッドは、SchoolIdolクラスでは定義していないわね。この場合は使えない・・・わけではなくて、Idolクラスに定義されたメソッドがそのまま使えるわ」
マル「IdolにできることはSchoolIdolでもできるってことなんだな」
ヨハネ「そう。外から見ると、SchoolIdolはIdolと同じように歌って踊れて、自己紹介には学校名が入る、といったところかしら」
ルビィ「Idolと違うところだけを実装すればいいんだね」
ヨハネ「そう。共通する部分はIdolに書いておけば、サブクラスにあたるSchoolIdolでもProfessionalIdolでも使えるから」

ヨハネ「このあたりを踏まえて、コードと実行結果を見比べてみると感覚は掴めると思うわ」
ルビィ「聞きそびれてたんだけど」
ヨハネ「あら、何?」
ルビィ「initializesuper name, age, groupってあるよね。これは?」
ヨハネ「ああ、superは、継承元クラス、すなわちスーパークラスのメソッドを呼び出す仕組みよ」
ルビィ「?」
ヨハネ「initializeメソッドはIdolとSchoolIdolの両方にあるわよね。これは、IdolのinitializeをSchoolIdolで上書き、オーバーライドしていると言うんだけど」
ルビィ「えーと、うん」
ヨハネ「SchoolIdolのinitializeの中でsuperを使うと、それはIdolのinitializeを呼び出すことになるの」
ルビィ「super name, age, groupって書くのは、Idolのinitialize name, age, groupっていう呼び出しと同じなんだね」
ヨハネ「そう、スーパークラスの同名のメソッドを呼び出すと考えればいいわ」

ヨハネ「まとめると」

  • スーパークラスのメソッドと変数はサブクラスでも使える
  • サブクラスでメソッドや変数の追加や上書き(オーバーライド)ができる
  • オーバーライドしたメソッドの中ではsuperを利用してスーパークラスの同名メソッドを呼び出せる

ヨハネ「こんなところかしらね」
マル「なるほど、それで差分プログラミングってわけだな」

ルビィ「じゃあ次回はルビィがモジュールの話をするね。最終回かな」


LINEで送る
Pocket


返信を残す

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