top
Loading...
Kotlin 接口

Kotlin 接口

Kotlin 接口與 Java 8 類似,使用 interface 關鍵字定義接口,允許方法有默認實現:

interface MyInterface { fun bar() // 未實現 fun foo() { //已實現 // 可選的方法體 println("foo") } }

實現接口

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

class Child : MyInterface { override fun bar() { // 方法體 } }

實例

interface MyInterface { fun bar() fun foo() { // 可選的方法體 println("foo") } } class Child : MyInterface { override fun bar() { // 方法體 println("bar") } } fun main(args: Array<String>) { val c = Child() c.foo(); c.bar(); }

輸出結果為:

foo
bar

接口中的屬性

接口中的屬性只能是抽象的,不允許初始化值,接口不會保存屬性值,實現接口時,必須重寫屬性:

interface MyInterface{ var name:String //name 屬性, 抽象的 } class MyImpl:MyInterface{ override var name: String = "runoob" //重寫屬性 }

實例

interface MyInterface { var name:String //name 屬性, 抽象的 fun bar() fun foo() { // 可選的方法體 println("foo") } } class Child : MyInterface { override var name: String = "runoob" //重寫屬性 override fun bar() { // 方法體 println("bar") } } fun main(args: Array<String>) { val c = Child() c.foo(); c.bar(); println(c.name) }

輸出結果為:

foo
bar
runoob

函數重寫

實現多個接口時,可能會遇到同一方法繼承多個實現的問題。例如:

實例

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() } } fun main(args: Array<String>) { val d = D() d.foo(); d.bar(); }

輸出結果為:

ABbar

實例中接口 A 和 B 都定義了方法 foo() 和 bar(), 兩者都實現了 foo(), B 實現了 bar()。因為 C 是一個實現了 A 的具體類,所以必須要重寫 bar() 併實現這個抽象方法。

然而,如果我們從 A 和 B 派生 D,我們需要實現多個接口繼承的所有方法,併指明 D 應該如何實現它們。這一規則 既適用於繼承單個實現(bar())的方法也適用於繼承多個實現(foo())的方法。

北斗有巢氏 有巢氏北斗