歡迎關注 二師兄Kotlin
轉載請注明出處 二師兄kotlin
Kotlin 的接口很像 java 8。它們都可以包含抽象方法,以及方法的實現。和抽象類不同的是,接口不能保存狀態。可以有屬性但必須是抽象的,或者提供訪問器的實現。
接口用關鍵字 interface
來定義:
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
實現接口
一個類或對象可以實現一個或多個接口
class Child : MyInterface {
override fun bar() {
// body
}
}
接口中的屬性
可以在接口中申明屬性。接口中的屬性要么是抽象的,要么提供訪問器的實現。接口屬性不可以擁有隱藏域(backing field),因此訪問器不可以引用它們。
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 中并沒有聲明它是抽象的,這是因為在接口中如果函數沒有函數體,那么默認是抽像的。
不過,如果我們從 A 中派生一個 C 實體類,顯然我們需要重寫 bar() ,并實現它。而我們從 A 和 B 派生一個 D ,我們不用重寫 bar() 方法,因為我們的一個繼承中有一個已經實現了它。但我們繼承了兩個 foo() 的實現,因此編譯器不知道應該選哪個,并強制我們重寫 foo() 并且明確指出我們想怎么實現。