Kotlin中的接口非常類似于Java 8。它們可以包含抽象方法的聲明以及方法實現(xiàn)。 使它們與抽象類不同的是接口不能存儲狀態(tài)。 它們可以具有屬性,但這些需要是抽象的或提供訪問器實現(xiàn)。
使用關鍵字:interface定義接口
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
類或對象可以實現(xiàn)一個或多個接口:
class Child : MyInterface {
override fun bar() {
// body
}
}
您可以在接口中聲明屬性。 在接口中聲明的屬性可以是抽象的,也可以為訪問者提供實現(xiàn)。 在接口中聲明的屬性不能具有后備字段,因此在接口中聲明的訪問器不能引用它們。
interface MyInterface {
val prop: Int // abstract
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(prop)
}
}
class Child : MyInterface {
override val prop: Int = 29
}
當在超類型列表中聲明很多類型時,可能會出現(xiàn)繼承同一方法的多個實現(xiàn)。 例如 -
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都聲明函數(shù)foo()和bar()。它們都實現(xiàn)了foo(),但只有B實現(xiàn)bar(),bar()在A中沒有標記為abstract,因為這是接口的默認值,如果函數(shù)沒有主體。 現(xiàn)在,如果類C類要實現(xiàn)A接口,顯然必須重寫bar()并提供一個實現(xiàn)。
然而,如果D類實現(xiàn)A和B的方法,需要實現(xiàn)從多個接口繼承的所有方法,并指定D應該如何實現(xiàn)它們。此規(guī)則既適用于繼承單個實現(xiàn)(bar())和多個實現(xiàn)(foo())的方法。