クラスの実装 〜 継承
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