クラスの実装 〜 継承

Kotlin のクラスを継承する方法を説明します。

Kotlin クラスはデフォルトで final、すなわち継承できないようになっています。このため、 継承を許可するには明示的に open キーワードをつける必要があります。

例えば Person クラスを継承して、Employee クラスを作るには、 次のように class の前に open とマークして、 このクラスが継承可能であることを指定しないといけません。

package test

open class Person {
    val name: String
    val id: Int

    init {
        println("=== Person init")
    }

    constructor(name: String, id: Int) {
        this.id = id
        this.name = name
    }

    open fun foo() {
        println("=== foo - Person")
    }
}

クラスを派生クラスを作る場合は class 派生クラス名 : 基底クラス名 という形式で、基底クラスを指定します。

次の例ではPerson クラスを継承し、Employee を作っています。

package test

class Employee: Person {
    val title: String

    init{
        println("*** Employee init")
    }

    constructor(name: String, id: Int, title: String): super(name, id) {
        this.title = title
    }

    override fun foo() {
        println("*** foo - Employee")
    }
}

いくつか注意点を指摘しておきます。

  • 派生クラスのコンストラクタから、基底クラスのコンストラクタを呼ぶには、super というキーワードを使います。
  • クラスの初期化を行う init がある場合は、基底クラスが先に呼ばれます。
  • メソッドのオーバーライド (同じ名前のメソッドの動作を変える) をする場合は、基底クラスのメソッド側で open を指定して、オーバーライドする側で override を付けてます。

上記の Employee を使うコードは次のようになります。

import test.Employee

fun main() {
    val p = Employee("Ichiro", 100, "Manager")
    println("${p.name} id=${p.id} title=${p.title}")
    p.foo()
}

実行結果は次の通りです。

=== Person init
*** Employee init
Ichiro id=100 title=Manager
*** foo - Employee

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Kotlin 入門