Kotlin教程 第8章 接口

Kotlin 接口與 Java 8 類似,使用 interface 關(guān)鍵字定義接口,允許方法有默認(rèn)實(shí)現(xiàn):

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

實(shí)現(xiàn)接口

一個類或者對象可以實(shí)現(xiàn)一個或多個接口。

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

實(shí)例

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();
}

輸出結(jié)果為:

foo
bar

接口中的屬性

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

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

實(shí)例

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)
}

輸出結(jié)果為:

foo
bar
runoob

函數(shù)重寫

實(shí)現(xiàn)多個接口時,可能會遇到同一方法繼承多個實(shí)現(xiàn)的問題。例如:

實(shí)例

interface A {
    fun foo() { print("A") }   // 已實(shí)現(xiàn)
    fun bar()                  // 未實(shí)現(xiàn),沒有方法體,是抽象的
}
 
interface B {
    fun foo() { print("B") }   // 已實(shí)現(xiàn)
    fun bar() { print("bar") } // 已實(shí)現(xiàn)
}
 
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();
}

輸出結(jié)果為:

ABbar

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

然而,如果我們從 A 和 B 派生 D,我們需要實(shí)現(xiàn)多個接口繼承的所有方法,并指明 D 應(yīng)該如何實(shí)現(xiàn)它們。這一規(guī)則 既適用于繼承單個實(shí)現(xiàn)(bar())的方法也適用于繼承多個實(shí)現(xiàn)(foo())的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容