/*子類可以為繼承來的實例方法,類方法,實例屬性,或下標提供自己定制的實現。我們把這種行為叫重寫。 如果要重寫某個特性,你需要在重寫定義的前面加上 關鍵字。這么做,你就表明了你是想提供一個重寫 版本,而非錯誤地提供了一個相同的定義。意外的重寫行為可能會導致不可預知的錯誤,任何缺少 關鍵 字的重寫都會在編譯時被診斷為錯誤。 關鍵字會提醒 Swift 編譯器去檢查該類的超類(或其中一個父類)是否有匹配重寫版本的聲明。這個 檢查可以確保你的重寫定義是正確的。 */ class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling at \(currentSpeed) miles per hour" } func makeNoise() { // 什么也不做 } } //重寫方法 /*在子類中,你可以重寫繼承來的實例方法或類方法,提供一個定制或替代的方法實現。*/ class Bicycle: Vehicle { override func makeNoise() { print("Choo Choo") } } //重寫屬性 /*你可以重寫繼承來的實例屬性或類型屬性,提供自己定制的 getter 和 setter,或添加屬性觀察器使重寫的屬性 可以觀察屬性值什么時候發生改變。*/ class Car: Vehicle { var gear = 1 override var description: String { return super.description + " in gear \(gear)" } } //重寫屬性觀察器 /*你可以通過重寫屬性為一個繼承來的屬性添加屬性觀察器。這樣一來,當繼承來的屬性值發生改變時,你就會被 通知到,無論那個屬性原本是如何實現的*/ class AutomaticCar: Car { override var currentSpeed: Double { didSet { gear = Int(currentSpeed / 10.0) + 1 } } } class First_Demo1: UIViewController { override func viewDidLoad() { super.viewDidLoad() let bicycle = Bicycle() print(bicycle.makeNoise()) // 打印 "Choo Choo" let car = Car() car.currentSpeed = 25.0 car.gear = 3 print("Car: \(car.description)") // 打印 "Car: traveling at 25.0 miles per hour in gear 3" let automatic = AutomaticCar() automatic.currentSpeed = 35.0 print("AutomaticCar: \(automatic.description)") // 打印 "AutomaticCar: traveling at 35.0 miles per hour in gear 4" //防止重寫 /* 1、你可以通過把方法,屬性或下標標記為 final 來防止它們被重寫,只需要在聲明關鍵字前加上 final 修飾符即 可(例如:final var ,final func ,final class func ,以及final subscript )。 2、如果你重寫了帶有 final 標記的方法,屬性或下標,在編譯時會報錯。在類擴展中的方法,屬性或下標也可以在 擴展的定義里標記為 final 的。 3、你可以通過在關鍵字 class 前添加 final 修飾符( final class )來將整個類標記為 final 的。這樣的類是不可 被繼承的,試圖繼承這樣的類會導致編譯報錯*/ }