Kotlin接口

Kotlin中的接口非常類似於Java 8。它們可以包含抽象方法的聲明以及方法實現。 使它們與抽象類不同的是接口不能存儲狀態。 它們可以具有屬性,但這些需要是抽象的或提供訪問器實現。

使用關鍵字:interface定義接口

interface MyInterface {
    fun bar()
    fun foo() {
      // optional body
    }
}

實現接口

類或對象可以實現一個或多個接口:

class Child : MyInterface {
    override fun bar() {
        // body
    }
}

接口屬性

您可以在接口中聲明屬性。 在接口中聲明的屬性可以是抽象的,也可以爲訪問者提供實現。 在接口中聲明的屬性不能具有後備字段,因此在接口中聲明的訪問器不能引用它們。

interface MyInterface {
    val prop: Int // abstract

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

解決重載衝突

當在超類型列表中聲明很多類型時,可能會出現繼承同一方法的多個實現。 例如 -

interface A {
    fun foo() { print("A") }
    fun bar()
}

interface B {
    fun foo() { print("B") }
    fun bar() { print("bar") }
}

class C : A {
    override fun bar() { print("bar") }
}

class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }

    override fun bar() {
        super<B>.bar()
    }
}

接口AB都聲明函數foo()bar()。它們都實現了foo(),但只有B實現bar()bar()A中沒有標記爲abstract,因爲這是接口的默認值,如果函數沒有主體。 現在,如果類C類要實現A接口,顯然必須重寫bar()並提供一個實現。

然而,如果D類實現AB的方法,需要實現從多個接口繼承的所有方法,並指定D應該如何實現它們。此規則既適用於繼承單個實現(bar())和多個實現(foo())的方法。