Kotlin - クラス - インターフェース

公開日:2019-11-24 更新日:2019-11-24
[Kotlin]

1. 概要

インターフェースについてです。
インターフェースを使うと、異なるクラスを同様に扱うことができます。
その代わり、各クラスはインターフェースのルールに従って実装する必要があります。


2. 基本

インターフェースにはメソッドのヘッダーだけ定義して、処理はクラス側で実装します。
処理をクラス側で実装しない場合、コンパイルエラーとなります。

interface ITest {
    fun test(msg:String)
}

class Test : ITest {
    override fun test(msg:String) {
        println("Test.test(): $msg")
    }
}

fun main() {
    val o:ITest = Test()
    o.test("Hello") // Test.test():Hello
}


3. プロパティの強制

インターフェースでプロパティを定義して、クラス側でプロパティの実装を強制させることができます。
内部的には、プロパティは setter と getter に変換され、メソッドとして処理されます。

interface ITest {
    // val value:Int = 100  // エラー。初期化はできない
    val value:Int
}

class Test : ITest {
    override val value = 100
}

fun main() {
    val o:ITest = Test()
    println(o.value)  // 100
}


4. メソッドの実装

Kotlin のインターフェースでは、抽象クラスのように、メソッドを実装することができます。
また、クラス側でメソッドをオーバーライドした場合、 super を使ってインターフェース側のメソッドを呼ぶこともできます。

interface ITest {
    fun test(msg:String) {
        println("ITest.test(): $msg")
    }
}

class Test : ITest { }

fun main() {
    val o:ITest = Test()
    o.test("Hello") // ITest.test(): Hello
}


5. インターフェースの複数指定

インターフェースを複数指定することができます。
また、複数のインターフェースで同じシグネチャのメソッドを定義した場合、クラス側で必ずオーバーライドする必要があります。

interface ITest1 {
    fun test() = "ITest1.test()"
}
interface ITest2 {
    fun test() = "ITest2.test()"
}
class Test : ITest1, ITest2 {
    override fun test():String {
        return "Test.test()"
    }
}

fun main() {
    val o = Test()
    println(o.test()) // Test.test()
}