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()
}
}
接口A
和B
都聲明函數foo()
和bar()
。它們都實現了foo()
,但只有B
實現bar()
,bar()
在A
中沒有標記爲abstract
,因爲這是接口的默認值,如果函數沒有主體。 現在,如果類C
類要實現A
接口,顯然必須重寫bar()
並提供一個實現。
然而,如果D
類實現A
和B
的方法,需要實現從多個接口繼承的所有方法,並指定D
應該如何實現它們。此規則既適用於繼承單個實現(bar()
)和多個實現(foo()
)的方法。