Part12: クラス

ことり「それじゃ今回からは、オブジェクト指向言語Kotlinの中心になるクラスについて説明していきます」

凛「そもそもクラスって何?」
ことり「実装の上では、型だと考えればいいかな。今まで出てきたのも、Stringクラスとか、Intクラスとか、Arrayクラスとか」
凛「実装の上では、かあ」
ことり「モデリングとか設計の話は、もう少し先でもいいと思うよ」

ことり「他の言語で出てきたようなサンプルコードを出しますね」

honoka singing!!
honoka dancing!!
いちご

ことり「SchoolIdolクラスというのを定義しています。スクールアイドルを扱うための型だね」
凛「え~っと、class SchoolIdolから見ていけばいいのかにゃ?」
ことり「うん。ざっと見ると、変数が3個、関数が2個、クラスが1個、あとinitとかconstructorっていうのが並んでるよね」
凛「変数と関数は見慣れた感じだね」
ことり「で、mainの方を見ると、var honoka = SchoolIdol("honoka", SchoolIdol.Profile("いちご", 78, 58, 82))っていうコードがあります。ここが、SchoolIdolのインスタンスを作ってるところ」
凛「インスタンス?」
ことり「SchoolIdolクラスはスクールアイドルという概念。それに対してインスタンスはスクールアイドル個人個人。穂乃果ちゃんとか海未ちゃんとか、ツバサさんとか千歌ちゃんとか」
凛「ここで作ってるのは穂乃果ちゃんなんだね」
ことり「そうそう。ここで、名前とか好きな食べ物とかスリーサイズを渡してhonokaオブジェクトを生成してます」
凛「あっ、それに対してhonoka.sing()とかでさっきの関数が呼べるんだ!」
ことり「正解。クラスの中に書いてあった関数や変数は、こうしてクラスのインスタンスに対して呼び出すことができます」

ことり「次はinitconstructorかな。これは今まで出てこなかったけど、クラスの初期化を行うコンストラクタという仕組みです」
凛「初期化?」
ことり「穂乃果ちゃんオブジェクトを作った時点で、名前とかは設定されてた方がいいよね。それをやるための仕組みだよ」

ことり「もう一回、var honoka = SchoolIdol("honoka", SchoolIdol.Profile("いちご", 78, 58, 82))を見ると、class SchoolIdol(name: String, profile: Profile)となんとなく対応付いてるのわかるかな」
凛「そういえば・・・」
ことり「インスタンスを作るときに渡された値は、classの宣言のところの引数並びと一致します。それを処理するためのブロックがinitで、この仕組みをプライマリコンストラクタといいます」

ことり「今度は海未ちゃんを見てみようか。var umi = SchoolIdol("umi", "Otonokizaka High.", SchoolIdol.Profile("ほむまん", 76, 58, 80))だから、引数が1つ多いよね」
凛「学校名が増えてるにゃ」
ことり「この場合、さっきのプライマリコンストラクタには当てはまらないから、今度はconstructorで宣言されたセカンダリコンストラクタに処理が渡ります」
凛「なるほど~、こっちだと数が合うにゃ」
ことり「this(name, profile)っていうのはプライマリコンストラクタの呼び出し。だから、セカンダリコンストラクタではプライマリになかった処理だけ書けばいいの」

ことり「最後に、classの中にあるclass、ネステッドクラス。・・・といってもこれは普通のクラスとほとんど同じで、SchoolIdol.Profileみたいに書くとアクセスできます」
凛「SchoolIdol.Profile("いちご", 78, 58, 82)みたいなのさっきから出てきてたよね」
ことり「あるクラスと関係性の深いクラスをネステッドクラスとして表現することがあります。それと、これの変種としてインナークラスっていうのもあってね」
凛「インナー・・・ネステッドとあんまり変わらない気がするにゃ」
ことり「例えば・・・」

ことり「Nestedはネステッドクラス、Innerはインナークラス。どっちも外側のname変数を参照しようとしてるけど、Innerからは参照できるけどNestedからは参照できません」
凛「スコープが違うんだね」


ことり「クラスについては勉強することがとてもたくさんあるから、まだまだ続くよ」
凛「ばっちこいにゃ!」


LINEで送る
Pocket


コメントを残す

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