標籤:automatic 屬性 聲明 return 錯誤 err car 重寫屬性 ring
子類可以為繼承來的執行個體方法,類方法,執行個體屬性,或下標提供自己定製的實現。我們把這種行為叫重寫。如果要重寫某個特性,你需要在重寫定義的前面加上 關鍵字。這麼做,你就表明了你是想提供一個重寫 版本,而非錯誤地提供了一個相同的定義。意外的重寫行為可能會導致不可預知的錯誤,任何缺少 關鍵 字的重寫都會在編譯時間被診斷為錯誤。關鍵字會提醒 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 的。這樣的類是不可 被繼承的,試圖繼承這樣的類會導致編譯報錯*/ }
swift-重寫方法和屬性、禁止重寫