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 = "itread01" //重寫屬性 }

例項

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

輸出結果為:

foo
bar
itread01

函式重寫

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

例項

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())的方法。