Kotlin入門-必會,接口

在這裏插入圖片描述

前言

Kotlin的繼承基本上跟java的類似。

Kotlin強化了接口實現接口的邏輯。可以更清晰的呈現 每個接口類的描述。

除了文字版本,也有Xmind版本 github地址


定義

使用 interface 定義
範例

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

接口中的屬性

只能是抽象的,不允許初始化值。
在接口中聲明的屬性

  • 要麼是抽象的
  • 要麼提供訪問器的實現

在接口中聲明的屬性不能有幕後字段(backing field)
實現接口時,必須重寫屬性。
範例

interface MyInterface {
    val prop: Int // 抽象的

    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

與java不同

  • java中可以定義 變量
  • 被繼承後,可以 使用這些變量

接口實現

與java一樣,在Kotlin中,類也可以實現多個interface

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

在Kotlin中,重寫必須要標明override。其實,在java也需要標記。這是早些年,不標記override也不報錯。


接口繼承

在Kotlin中,接口可以實現接口。

  • 既提供基類型成員的實現
  • 也聲明新的函數與屬性
    範例
interface Named {
    val name: String
}

interface Person : Named {
    val firstName: String
    val lastName: String
    
    override val name: String get() = "$firstName $lastName"
}

data class Employee(
    // 不必實現“name”
    override val firstName: String,
    override val lastName: String,
    val position: Position
) : Person

解決覆蓋衝突

實現多個接口時,可能會遇到同一方法繼承多個實現的問題.
這裏從簡說。在之前的文章中有提及

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()   ///注意看這裏
    }
}

遇到同一方法,繼承多個實現,那就需要明確標明!


小結

Kotlin接口繼承的做法,強調了,實現接口的子類需要了解的東西。而被實現的接口的父類部分則隱藏了。

Kotlin解決了實現多個接口時,繼承多個同名實現的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章