Part17: 拡張関数と拡張プロパティ

凛「シーラ!カンス! #夏のシーラカンス祭り」
ことり「連休ということで、内浦へ行ってきました♪」
凛「雨だったけどにゃ・・・」
ことり「凛ちゃんの天候操作スキルも、善子ちゃんには敵わなかったみたいだね」
凛「#リトルデーモンの証」
ことり「三津シーとか三の浦観光案内所とか、もちろんヌーマーズも、すごくAqours推しでびっくりしちゃった」
凛「7月が楽しみだにゃ~っ!!」


ことり「今回は拡張関数。すでにあるクラスに対して後から機能を追加できる仕組みです」

ことり「例を見た方がいいのかな。たとえば・・・」

Singing!!
Dancing!!

ことり「SchoolIdolクラスにsing関数があって、それを呼び出してる、まではいいよね」
凛「普通のクラスの使い方だよね」
ことり「で、最初に戻って、SchoolIdolクラスにdance関数を追加しています。すると、danceSchoolIdolのメンバみたいに呼び出すことができるんです」
凛「『メンバみたいに』?」
ことり「うん。継承とかが絡んでくると、少しややこしくなるんだ」

ことり「Idolクラスと、それを継承したSchoolIdolクラスがあります。それぞれのクラスに拡張関数helloを追加しました。これはいいよね」
凛「IdolSchoolIdolのインスタンスでhello関数が使えるようになったんだよね」
ことり「そうそう。で、インスタンスとして卯月ちゃんと穂乃果ちゃんと海未ちゃん。クラスと、代入してる変数の型に注目してね」
凛「海未ちゃんはSchoolIdolクラスのインスタンスだけど、変数の型はIdolにゃ」
ことり「ここで、3人それぞれのhello関数を呼び出してみます。

I’m Idol
I’m SchoolIdol
I’m Idol

凛「あれ、海未ちゃんはI'm Idolになるの?」
ことり「ここが拡張関数の、継承と違うところ。もしIdolクラスがメンバとしてhello関数を持っていて、それをSchoolIdolクラスでオーバーライドしてたら、ここはI'm SchoolIdolになるよね」
凛「インスタンスが何かじゃなくて、変数の型で呼び出される関数が決まるってことかにゃ」
ことり「あくまで静的に解決されるということです」

ことり「プロパティも同じようにできます」

Uzuki

ことり「これはfirstNameっていうプロパティを追加してます。拡張プロパティはバッキングフィールドを持たないから、getterとsetterは定義してあげる必要があります」
凛「インターフェイスのときと一緒にゃ」


ことり「JavaScriptとかだと当たり前のようにある言語機能なんだけど、openついてなくて継承できないクラスを拡張できたりとか、いろいろ便利です」
凛「そんなに難しくもなかったにゃ!」
ことり「次回はデータクラスのお話をしますね」


LINEで送る
Pocket


返信を残す

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