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