Skip to content

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をもとにして、ゲームから呼ばれる動きを定義しています。その仕組みが次の「継承」です。