基类(Base Class)被子类(Subclassing)继承,这个OC的继承思想很相似,唯一的不同就是语法的规范不一样。
1、新建一个基类
首先我们新建一个基类(Vehicle)声明一个属性(currentSpeed), 一个只读计算型属性(description),
在基类中定义一个方法makeNoise():
import UIKit
class Vehicle {
var currentSpeed = 0.0
var description: String{
return "traveling at \(currentSpeed) miles per hour"
}
func makeNoise() {
}
}
2、新建子类,继承基类
新建子类(Bicycle),并在子类中添加子类自己的属性(这些属性是基类没有的)hasBasket(bool型)、gear(Int型)、color(String型):
import UIKit
class Bicycle: Vehicle {
var hasBasket = false
var color:String = "red"
var gear = 1
}
3、在子类中重新父类方法 makeNoise()
子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)。重新某个特性(方法、属性)都需要在前面加 override关键字。
override func makeNoise() {
print("重新父类的makeNoise()方法")
}
4、重写父类的属性 description
子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性会有一个名字和类型。你在重写一个属性时,必需将它的名字和类型都写出来:
override var description: String{
return super.description + "color is \(color)"
}
5、重写属性(currentSpeed)观察器(Property Observer)
可以通过重写属性为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,你就会被通知到,无论那个属性原本是如何实现的。
注意:
你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供willSet
或didSet
实现是不恰当。
此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。
override var currentSpeed: Double{
didSet{
gear = Int(currentSpeed/10.0) + 1
}
}
即:当对currentSpeed属性进行赋值时实现didset方法,gear的值也跟着变化了。
实例一个 子类(Bicycle)并对父类的属性(currentSpeed)进行赋值 10000,可以打印出gear的值是:1001
let bicycle = Bicycle()
bicycle.currentSpeed = 10000
print("bicycle.gear: \(bicycle.gear)")