Kotlin類與對象篇(3)--接口


歡迎關注 二師兄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() 并且明確指出我們想怎么實現。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容