介面
以下是 Kotlin 介面(Interface) 的基礎教學,包括介面的定義、使用方式、多介面實現、屬性與方法。
1. 什麼是介面(Interface)?
Kotlin 介面的特性
- 介面是用來定義類別的行為契約,類別可以實現一個或多個介面。
- 介面可以包含:
- 抽象方法:子類別必須實現的方法。
- 具體方法(預設方法):子類別可以直接使用的方法。
- 屬性:可以是抽象屬性(無初始值)或具體屬性(有初始值)。
語法
interface InterfaceName {
fun abstractMethod() // 抽象方法
fun concreteMethod() { // 預設方法
// 方法實作
}
val abstractProperty: String // 抽象屬性
val concreteProperty: String get() = "Default Value" // 具體屬性
}
2. 定義和實現介面
- 使用
interface
關鍵字定義介面。 - 實現介面的類別需要用
:
繼承介面。 - 使用
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. 屬性在介面中的使用
- 介面的屬性可以是 抽象屬性 或 具體屬性。
- 抽象屬性需要子類別提供具體實現。
- 具體屬性可以直接使用預設的
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. 多介面實現
- 類別可以實現多個介面,並用逗號分隔。
- 每個介面的方法都必須實現。
範例:
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) |
---|---|---|
繼承數量 | 可以實現多個介面 | 只能繼承一個抽象類別 |
建構函數 | 無建構函數 | 可以定義建構函數 |
使用場合 | 行為契約,定義類別應實現的功能 | 提供通用功能,適合類別的基礎設計 |