Kotlin 繼承與介面 (Interface)

Kotlin 的繼承機制有一些安全性的考量,預設是 禁止繼承 的。

開放繼承 (open)

在 Java 中,所有類別預設都能被繼承 (除了 final)。 在 Kotlin 中,類別預設就是 final。如果要允許繼承,必須加上 open 關鍵字。

// 父類別
open class Animal {
    // 方法也要 open 才能被 override
    open fun makeSound() {
        println("Some sound")
    }
}

// 子類別 (繼承使用 : )
class Dog : Animal() {
    override fun makeSound() {
        println("Bark!")
    }
}

介面 (Interface)

介面跟 Java 很像,定義一組行為規範。 不同的是,Kotlin 的介面甚至可以包含 實作的方法 (Default implementation)。

interface Flyable {
    fun fly() // 抽象方法
    
    // 有實作的方法
    fun land() {
        println("Landed.")
    }
}

class Bird : Flyable {
    override fun fly() {
        println("Bird flying")
    }
}
}

抽象類別 (Abstract Class)

跟 Java 一樣,abstract 類別不能被實例化,且方法預設就是 open 的。

abstract class Shape {
    abstract fun draw()
}

class Circle : Shape() {
    override fun draw() {
        // ...
    }
}

super 關鍵字

子類別可以使用 super 來呼叫父類別的方法。

override fun fly() {
    super.fly() // 呼叫父類別實作
    println("Adding extra logic")
}