以下是 Kotlin 介面(Interface) 的基礎教學,包括介面的定義、使用方式、多介面實作、屬性與方法。
1. 什麼是介面(Interface)?#
Kotlin 介面的特性#
- 介面是用來定義類別的行為契約,類別可以實作一個或多個介面。
- 介面可以包含:
- 抽象方法:子類別必須實作的方法。
- 具體方法(預設方法):子類別可以直接使用的方法。
- 屬性:可以是抽象屬性(無初始值)或具體屬性(有初始值)。
1
2
3
4
5
6
7
8
| interface InterfaceName {
fun abstractMethod() // 抽象方法
fun concreteMethod() { // 預設方法
// 方法實作
}
val abstractProperty: String // 抽象屬性
val concreteProperty: String get() = "Default Value" // 具體屬性
}
|
2. 定義和實作介面#
- 使用
interface 關鍵字定義介面。 - 實作介面的類別需要用
: 繼承介面。 - 使用
override 關鍵字實作介面的方法。
範例 1:單一介面#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 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。
範例:#
1
2
3
4
5
6
7
8
9
10
11
12
| 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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| 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<介面名稱> 明確指定要呼叫哪個介面的實作。
範例:#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| 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