//一个类可以继承另一个类的方法属性和它的特性,当一个类继承其他类时,继承类叫做子类,被继承类叫做超类(或父类)
//子类可以调用和访问父类的方法,属性和下标,并且可以重写这些方法,属性和下标来优化或修改他们的行为.
//可以为类中继承来的属性添加属性观察器,当属性改变时,类就会被通知到,可以为人设尚需经添加属性观察器
//定义一个类
class Vehicle {
var currentSpeed = 0.0
var description: String {
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
//什么也不做,因为车辆不一定有噪音
}
}
//初始化一个Vehicle的新实例
let someVehicle = Vehicle()
//访问description来打印车辆的当前速度
print(someVehicle.description)
//子类生成
class Bicycle: Vehicle {
var hasBasket = false
}
let bicycle = Bicycle()
bicycle.hasBasket = true
bicycle.currentSpeed = 15.0
print(bicycle.description)
//这样子类既有自己的方法,也继承了父类的方法和属性,子类可访问父类方法和属性,但父类不能访问子类的方法和属性
//重写
//子类可以为继承来的的实例方法,类方法,实例属性,或下标提供自己的定制实现,称作重写
//如果重写某个特性,需要在重写定义前加上override关键字,任何缺少override关键字的重写都会在编译时被诊断为错误
//override关键字会提醒Swift编译器去检查该类的超类是否有匹配的重写版本声明,确保重写定义是正确的
class Train: Vehicle {
override func makeNoise() {
print("Choo Choo")
}
}
let train = Train()
train.makeNoise()
//重写属性
//重写继承类的实例属性或类型属性吗,提供自己定制的getter和setter,或添加属性观察器,是重写的属性可以被观察属性的变化
//重写一个属性时,必须将属性的名字和类型都写出来,这样才能使编译器检查重写的属性与超类中的同名同类的属性相匹配
class Car:Vehicle {
var gear = 1
override var description: String {
return super.description + "in gear \(gear)"
}
}
let car = Car()
car.currentSpeed = 25.0
car.gear = 3
print(car.description)
//重写属性观察器
class AutomaticCar: Car {
override var currentSpeed: Double {
didSet {
gear = Int(currentSpeed / 10.0) + 1
}
}
}
let automatic = AutomaticCar()
automatic.currentSpeed = 35.0
print("AutomaticCar: \(automatic.description)")
//防止重写
//可以通过方法,属性或下标标记为final来防止他们被重写,只需要在声明关键在前加final修饰符即可
class SmallCar: Vehicle {
final var size: Double = 0.0
}
//可以通过在关键在class前添加final修饰符(final class)来将整个类标记为final,这样整个类都不允许被继承,试图继承这样的类会导致编译错误