Swift 類別繼承 (Inheritance)
繼承是物件導向程式設計的核心。一個類別可以繼承另一個類別的方法、屬性和其他特性。
- 子類別 (Subclass):繼承別人的類別。
- 父類別 (Superclass):被繼承的類別。
在 Swift 中,只有類別 (Class) 支援繼承。結構 (Struct) 和列舉 (Enum) 不支援。
為什麼需要繼承?
在真實世界中,分類是很有層次感的。例如,「交通工具」是一個大類別,包含了「汽車」和「腳踏車」。而「汽車」底下又可以細分為「跑車」和「卡車」。
在程式設計中,繼承讓我們的類別也能擁有這種層次關係,主要好處有:
- 程式碼重用 (Code Reuse):子類別自動擁有父類別所有的功能,不需要重新複製貼上程式碼。
- 易於維護:如果父類別的邏輯修正了 (例如修復了一個 Bug),所有繼承它的子類別都會同時受益。
- 擴充性:子類別可以在不改變父類別的情況下,增加自己獨有的功能。
簡單來說,繼承就是建立一種「IS-A (是一個)」的關係。例如:Bicycle is a Vehicle (腳踏車是一個交通工具)。
定義基礎類別 (Base Class)
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
// 預設什麼都不做
}
}
定義子類別
在類別名稱後面加上冒號和父類別名稱:
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0 // 繼承自 Vehicle
覆寫 (Overriding)
子類別可以提供父類別方法的自定義實作,這稱為覆寫。你需要使用 override 關鍵字。
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
你也可以覆寫屬性 (通常是為了添加觀察者 Property Observers):
class Car: Vehicle {
var gear = 1
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
如果需要在覆寫的方法中呼叫父類別的原本實作,使用 super 前綴:
super.makeNoise()
防止覆寫 (Preventing Overrides)
如果你不希望某個方法或屬性被子類別覆寫,可以使用 final 關鍵字:
final var speedLimit = 60.0
final func emergencyStop() { /* ... */ }
如果你將整個類別標記為 final (final class),那麼這個類別就完全不能被繼承。這在效能優化和框架設計中很有用。