13.继承 Inheritance Swift官方文档——版纳的笔记

//: Playground - noun: a place where people can play

import UIKit

// # 定义一个基类
class Vehicle {
    var currentSpeed = 0.0
    var description: String {
        return "traveling at \(currentSpeed) miles per hour"
    }
    func makeNoise() {
        // do nothing by default
    }
}

// # 子类
class Bicycle: Vehicle {
    var hasBasket = false {
        didSet {
            print("There is \(hasBasket ? "a" : "no") basket.")
        }
    }
}
class Tandem: Bicycle {
    var currentNumberOfPassengers = 0
} // 双人自行车
let tandem = Tandem()
tandem.hasBasket = true // 可见属性观察者也会被继承

// # 重写
// 子类可以提供它自己的实例方法、类型方法、实例属性,类型属性或下标脚本的自定义实现,否则它将会从父类继承。
// 一个命名为 someMethod() 的重写方法可以通过 super.someMethod() 在重写方法的实现中调用父类版本的 someMethod() 方法.
// 一个命名为 someProperty 的重写属性可以通过 super.someProperty 在重写的 getter 或 setter 实现中访问父类版本的 someProperty 属性.
// 一个命名为 someIndex 的重写下标脚本可以使用 super[someIndex] 在重写的下标脚本实现中访问父类版本中相同的下标脚本。
// 重写整理:重写let存储属性 重写var存储属性  重写get计算属性 重写get-set计算属性
// 为:     不能重写       get-set计算属性  get或get-set  get-set

class Car: Vehicle {
    var gear = 1
    override var description: String {
        get {
            return super.description + " in gear \(gear)"
        }
    }
}
let car = Car()
car.currentSpeed = 25
car.gear = 3
print("Car: \(car.description)")
// 重写属性观察器
class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            gear = Int(currentSpeed / 10) + 1
        }
    }
} // 注意:虽然写了是override,实际只是添加了属性观察器,其默认值不变且其还是存储属性
let automatic = AutomaticCar()
automatic.currentSpeed
automatic.currentSpeed = 35
print("AutomaticCar: \(automatic.description)")

// # 阻止重写
// 可以通过标记为终点来阻止一个方法、属性或者下标脚本被重写。通过在方法、属性或者下标脚本的关键字前写 final 修饰符(比如 final var , final func , final class func , fianl subscript )。
// 在扩展中添加到类的方法、属性或下标脚本也可以在扩展的定义里被标记为终点。
// 你可以通过在类定义中在 class 关键字前面写 final 修饰符( final class )标记一整个类为终点。任何想要从终点类创建子类的行为都会被报告一个编译时错误。

你可能感兴趣的:(13.继承 Inheritance Swift官方文档——版纳的笔记)