Kotlin教學 | 從零開始學Kotlin | Kotlin入門 | CH10: 介面(Interface)

介面

以下是 Kotlin 介面(Interface) 的基礎教學,包括介面的定義、使用方式、多介面實現、屬性與方法。


1. 什麼是介面(Interface)?

Kotlin 介面的特性

  • 介面是用來定義類別的行為契約,類別可以實現一個或多個介面。
  • 介面可以包含:
    1. 抽象方法:子類別必須實現的方法。
    2. 具體方法(預設方法):子類別可以直接使用的方法。
    3. 屬性:可以是抽象屬性(無初始值)或具體屬性(有初始值)。

語法

interface InterfaceName {
    fun abstractMethod() // 抽象方法
    fun concreteMethod() { // 預設方法
        // 方法實作
    }
    val abstractProperty: String // 抽象屬性
    val concreteProperty: String get() = "Default Value" // 具體屬性
}

2. 定義和實現介面

  1. 使用 interface 關鍵字定義介面。
  2. 實現介面的類別需要用 : 繼承介面。
  3. 使用 override 關鍵字實現介面的方法。

範例 1:單一介面

interface Animal {
    fun sound() // 抽象方法
    fun eat() { // 預設方法
        println("This animal is eating.")
    }
}

class Dog : Animal {
    override fun sound() {
        println("The dog barks.")
    }
}

fun main() {
    val dog = Dog()
    dog.sound() // 輸出:The dog barks.
    dog.eat()   // 輸出:This animal is eating.
}

3. 屬性在介面中的使用

  1. 介面的屬性可以是 抽象屬性具體屬性
  2. 抽象屬性需要子類別提供具體實現。
  3. 具體屬性可以直接使用預設的 getter

範例:

interface Animal {
    val name: String // 抽象屬性
    val type: String get() = "Generic Animal" // 預設屬性
}

class Dog(override val name: String) : Animal

fun main() {
    val dog = Dog("Buddy")
    println("Name: ${dog.name}") // 輸出:Name: Buddy
    println("Type: ${dog.type}") // 輸出:Type: Generic Animal
}

4. 多介面實現

  1. 類別可以實現多個介面,並用逗號分隔。
  2. 每個介面的方法都必須實現。

範例:

interface Flyable {
    fun fly()
}

interface Swimmable {
    fun swim()
}

class Duck : Flyable, Swimmable {
    override fun fly() {
        println("The duck is flying.")
    }

    override fun swim() {
        println("The duck is swimming.")
    }
}

fun main() {
    val duck = Duck()
    duck.fly()  // 輸出:The duck is flying.
    duck.swim() // 輸出:The duck is swimming.
}

5. 介面方法衝突的解決

如果多個介面中有相同的方法簽名,子類別必須使用 super<介面名稱> 明確指定要調用哪個介面的實現。

範例:

interface Flyable {
    fun move() {
        println("Flying in the sky.")
    }
}

interface Walkable {
    fun move() {
        println("Walking on the ground.")
    }
}

class Bird : Flyable, Walkable {
    override fun move() {
        // 指定使用 Flyable 的 move 方法
        super<Flyable>.move()
        // 指定使用 Walkable 的 move 方法
        super<Walkable>.move()
    }
}

fun main() {
    val bird = Bird()
    bird.move()
    // 輸出:
    // Flying in the sky.
    // Walking on the ground.
}

6. 類別與介面的主要區別

功能介面(Interface)類別(Class)
繼承限制可以實現多個介面只能繼承一個父類別
成員只能包含方法、屬性,無法定義建構函數可以包含建構函數與屬性
具體實現方法可以是抽象或有具體實現方法可以是抽象或有具體實現
使用情境定義行為契約定義具體對象

7. 介面與抽象類別的比較

功能介面(Interface)抽象類別(Abstract Class)
繼承數量可以實現多個介面只能繼承一個抽象類別
建構函數無建構函數可以定義建構函數
使用場合行為契約,定義類別應實現的功能提供通用功能,適合類別的基礎設計

Reference

https://kotlinlang.org/docs/interfaces.html

發佈留言