Swift 物件繼承 (Inheritance)

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

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

定義基礎類別 (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),那麼這個類別就完全不能被繼承。這在效能優化和框架設計中很有用。