歡迎關注 二師兄Kotlin
轉(zhuǎn)載請注明出處 二師兄kotlin
Kotlin 的接口很像 java 8梳码。它們都可以包含抽象方法惨缆,以及方法的實現(xiàn)。和抽象類不同的是势告,接口不能保存狀態(tài)岸啡≡#可以有屬性但必須是抽象的赫编,或者提供訪問器的實現(xiàn)巡蘸。
接口用關鍵字 interface
來定義:
interface MyInterface {
fun bar()
fun foo() {
// optional body
}
}
實現(xiàn)接口
一個類或?qū)ο罂梢詫崿F(xiàn)一個或多個接口
class Child : MyInterface {
override fun bar() {
// body
}
}
接口中的屬性
可以在接口中申明屬性。接口中的屬性要么是抽象的擂送,要么提供訪問器的實現(xiàn)悦荒。接口屬性不可以擁有隱藏域(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
}
解決重寫沖突
當我們在父類中聲明了許多類型搬味,有可能出現(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 接口都有聲明了 foo() 和 bar() 函數(shù)。它們都實現(xiàn)了 foo() 方法碰纬,但只有 B 實現(xiàn)了 bar() ,bar() 在 A 中并沒有聲明它是抽象的萍聊,這是因為在接口中如果函數(shù)沒有函數(shù)體,那么默認是抽像的悦析。
不過寿桨,如果我們從 A 中派生一個 C 實體類,顯然我們需要重寫 bar() 强戴,并實現(xiàn)它亭螟。而我們從 A 和 B 派生一個 D ,我們不用重寫 bar() 方法骑歹,因為我們的一個繼承中有一個已經(jīng)實現(xiàn)了它预烙。但我們繼承了兩個 foo() 的實現(xiàn),因此編譯器不知道應該選哪個道媚,并強制我們重寫 foo() 并且明確指出我們想怎么實現(xiàn)扁掸。