swift-重寫方法和屬性、禁止重寫


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM