表示テーマ
5. クラス
学習目標: クラスとインスタンスを区別し、インスタンスごとの値を使える。
普通のジャンプ台と強いジャンプ台には、強さを持ち、踏まれるとジャンプさせるという共通点があります。共通するデータと処理をクラスで定義します。
クラスは定義、インスタンスは個々の実体
kotlin
class JumpPad(val power: Double) {
fun launch(): Double {
return power
}
}このJumpPadは練習用で、ゲームのブロックではありません。
val power: Doubleは、そのインスタンスが持つプロパティです。launchはクラスに属する関数(メソッド)で、そのインスタンスのpowerを返します。
作るときに値を渡す
kotlin
val normal = JumpPad(1.0)
val strong = JumpPad(1.8)
println(normal.power)
println(strong.launch())JumpPad(...)はコンストラクタを呼んでインスタンスを作ります。Kotlinではnewは書きません。ここでは別々の実体が2つ作られ、それぞれ1.0と1.8を持ちます。
.は「その実体が持っているものにアクセスする」という読み方です。normal.powerは値を読む、strong.launch()は関数を呼ぶ、という違いがあります。
予想:returnを固定したら?
return powerをreturn 2.0に変えると、normal.launch()とstrong.launch()はどうなるでしょう?
説明
どちらも2.0です。引数で違うpowerを持たせても、launchの処理がその値を使っていないからです。
2つのジャンプ台を作ろう
strongのpowerだけを1.8にする。normalは1.0のままにする。
目標の出力
1.0 1.8
自動採点ではありません。入力を変えた場合も結果を確かめてください。
ヒント 1
JumpPad(...)を呼ぶたびに別のインスタンスが作られる。
ヒント 2
strongを作るときの引数を変えよう。クラスのreturnを1.8に固定すると両方変わってしまう。
解答例
class JumpPad(val power: Double) {
fun launch(): Double {
return power
}
}
fun main() {
val normal = JumpPad(1.0)
val strong = JumpPad(1.8)
println(normal.launch())
println(strong.launch())
}解答例を閉じて、もう一度自分で書いてみてください。これ以外の正しい書き方もあります。
valでも中身が変わる場合
kotlin
class Counter(var count: Int)
fun main() {
val counter = Counter(0)
counter.count = 1 // OK:中のvarを書きかえる
// counter = Counter(2) // NG:valへの再代入
println(counter.count)
}外側のval counterは、別のインスタンスへの再代入を禁止します。内側のvar countは変更可能です。第1章の「valは再代入できない」と矛盾しません。
さらにval other = counterと書くと、もう一つのCounterを作るのではなく、同じ実体を指します。other.count = 5にするとcounter.countも5です。整数を代入した第1章の例との違いを確かめましょう。
MODでの使用例
実際のJumpPadBlockもクラスです。ただしMinecraftのBlockをもとにして、ゲームから呼ばれる動きを定義しています。その仕組みが次の「継承」です。