Swift 類別繼承 (Inheritance)

繼承是物件導向程式設計的核心。一個類別可以繼承另一個類別的方法、屬性和其他特性。

  • 子類別 (Subclass):繼承別人的類別。
  • 父類別 (Superclass):被繼承的類別。
在 Swift 中,只有類別 (Class) 支援繼承。結構 (Struct) 和列舉 (Enum) 不支援。

為什麼需要繼承?

在真實世界中,分類是很有層次感的。例如,「交通工具」是一個大類別,包含了「汽車」和「腳踏車」。而「汽車」底下又可以細分為「跑車」和「卡車」。

在程式設計中,繼承讓我們的類別也能擁有這種層次關係,主要好處有:

  1. 程式碼重用 (Code Reuse):子類別自動擁有父類別所有的功能,不需要重新複製貼上程式碼。
  2. 易於維護:如果父類別的邏輯修正了 (例如修復了一個 Bug),所有繼承它的子類別都會同時受益。
  3. 擴充性:子類別可以在不改變父類別的情況下,增加自己獨有的功能。

簡單來說,繼承就是建立一種「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),那麼這個類別就完全不能被繼承。這在效能優化和框架設計中很有用。