※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

10-4. クラスの継承

2023年9月28日

概要

継承 (Inheritance) はオブジェクト指向プログラミング言語の重要な機能です。
継承により、既存のクラスの機能を新しいクラスに継承できます。継承を使用すると、情報が階層的な順序で管理可能になります。

Kotlin では、クラスのプロパティと関数を、あるクラスから別のクラスに継承することができます。
継承元のクラスをスーパークラス (Super Class) 、または親クラス、基底クラス といい、スーパークラスを継承するクラスをサブクラス (Sub Class)、または子クラスといいます。 サブクラスには、スーパークラスの機能と独自の追加機能を持つこともできます。

ただし、Kotlin においては、あるクラスが複数のクラスを継承することはできませんので、この点は注意が必要です。

継承可能なクラスの定義方法

Kotlin では、クラス定義を行ってもデフォルトでは継承できないようになっています。
継承可能なクラスとして定義するには、open 修飾子を付ける必要があります。 さらに、その中でオーバーライド可能なメソッドにも open 修飾子を付ける必要があります。

例)
前の節で記載した Person クラスを継承可能にした例です。

open class Person (var name : String = "", var age : Int = 0) {  // constructor というキーワードも省略
    open fun greeting(){
        println("Hello World! 私は ${name} です。年齢は ${age} 才です。")
    }
}
fun main(){
    val myPersonObj : Person = Person("HogeHoge", 3)
    myPersonObj.greeting()
}

サブクラスの作成

サブクラスを作成するには、コロン (:) の後に親クラスの名前を指定します。

サブクラスのコンストラクタは、親クラスのコンストラクタを呼び出す必要があります。 親クラスにプライマリコンストラクタがある場合は、サブクラスのコンストラクタヘッダーで親クラスのコンストラクタを呼び出す必要があります。

上記の Person クラスを継承したサブクラス Employee クラスを作成してみます。
Employee クラスでは、Person クラスの name と age プロパティを継承し、さらに独自の empid プロパティを定義しています。

open class Person (var name : String = "", var age : Int = 0) {
    fun greeting() {
        println("Hello World! 私は ${name} です。年齢は ${age} 才です。")
    }
}

class Employee (name: String, age : Int, val empid : Int = 0) : Person(name,age)

fun main(){
    val myEmployeeObj : Employee = Employee("HogeHoge", 22, 20230001)
    myEmployeeObj.greeting()
    println("社員番号は ${myEmployeeObj.empid} です。")
}

出力)

Hello World! 私は HogeHoge です。年齢は 22 才です。
社員番号は 20230001 です。