KotlinDive

プログラミング言語 Kotlin についての入門ブログです。

クラス(抽象クラス/インターフェース)

抽象クラス

クラスのメンバーにキーワード「abstract」をつけて宣言することができます。 これを抽象メンバーと言います。
抽象メンバーは処理や値といった具体的な実装を持ちません(持つことができません)
抽象メンバを持つクラスを抽象クラスと呼び、このクラスにも「abstract」キーワードを付ける必要があります。
抽象クラスはインスタンス化することができません。
その理由は、抽象クラスは抽象メンバという具体的な実装を持たないメンバーが含んでいて、 それ単体では不完全な状態だからです。


fun main(args: Array) {
    // Personは抽象クラスなのでインスタンス化できない
    // 以下のコードはビルドエラーになる
    // val someone = Person("someone")
}

abstract class Person(name: String) {
    abstract var name: String
    abstract fun describe()
}

抽象メンバーは自動的にオーバーライド可能な「open」になります。
抽象クラスを直接インスタンス化することはできませんが、 抽象クラスを検証した派生クラスで抽象メンバーをオーバーライドして具体的な実装を与えることで 利用することができます。


fun main(args: Array) {
    val someone: Person = Student("suzuki")

    someone.describe()
}

abstract class Person(name: String) {
    abstract var name: String
    abstract fun describe()
}

class Student(name: String) : Person(name) {
    override var name = name
    override fun describe() {
        println("name: ${name}")
    }
}

name: suzuki

インターフェース

KotlinにはJavaと同じようなインターフェースが存在します。
インターフェースと抽象クラスとの違いは、データを保持できるかどうかです。


fun main(args: Array) {
    val someone: Printable = Student("suzuki")

    someone.Print()
    someone.PrintImpl()
}

interface Printable {
    fun Print() // 何もしないと自動的に「open」で「abstract」
    fun PrintImpl() {
        // インターフェースの関数でも実装することは可能
        println("print impl")
    }
}

class Student(name: String) : Printable {
    val name = name

    override fun Print() {
        println("name = ${name}")
    }
}

name = suzuki
print impl