//: 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 )标记一整个类为终点。任何想要从终点类创建子类的行为都会被报告一个编译时错误。
网友评论