/*子类可以为继承来的实例方法,类方法,实例属性,或下标提供自己定制的实现。我们把这种行为叫重写。 如果要重写某个特性,你需要在重写定义的前面加上 关键字。这么做,你就表明了你是想提供一个重写 版本,而非错误地提供了一个相同的定义。意外的重写行为可能会导致不可预知的错误,任何缺少 关键 字的重写都会在编译时被诊断为错误。 关键字会提醒 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 的。这样的类是不可 被继承的,试图继承这样的类会导致编译报错*/ }