一个类可以继承(inherit)另一个类的方法(methods),属性(properties)和其它特性。当一个类继承其它类时,继承类叫子类(subclass),被继承类叫超类(或父类,superclass)。在 Swift 中,继承是区分「类」与其它类型的一个基本特征。
可以为类中继承来的属性添加属性观察器(property observers),这样一来,当属性值改变时,类就会被通知到。可以为任何属性添加属性观察器,无论它原本被定义为存储型属性(stored property)还是计算型属性(computed property)。
重写(Overriding)
子类可以为继承来的实例方法(instance method),类方法(class method),实例属性(instance property),或下标脚本(subscript)提供自己定制的实现(implementation)。我们把这种行为叫重写(overriding)。
如果要重写某个特性,你需要在重写定义的前面加上override
关键字。这么做,你就表明了你是想提供一个重写版本,而非错误地提供了一个相同的定义。意外的重写行为可能会导致不可预知的错误,任何缺少override
关键字的重写都会在编译时被诊断为错误。
override
关键字会提醒 Swift 编译器去检查该类的超类(或其中一个父类)是否有匹配重写版本的声明。这个检查可以确保你的重写定义是正确的。
重写属性
你可以重写继承来的实例属性或类型属性,提供自己定制的 getter 和 setter,或添加属性观察器使重写的属性可以观察属性值什么时候发生改变。
重写属性的 Getters 和 Setters
你可以将一个继承来的只读属性重写为一个读写属性,只需要在重写版本的属性里提供 getter 和 setter 即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。
ps: 如果你在重写属性中提供了 setter,那么你也一定要提供 getter。如果你不想在重写版本中的 getter 里修改继承来的属性值,你可以直接通过
super.someProperty
来返回继承来的值,其中someProperty
是你要重写的属性的名字。
重写属性观察器(Property Observer)
你可以通过重写属性为一个继承来的属性添加属性观察器。这样一来,当继承来的属性值发生改变时,你就会被通知到,无论那个属性原本是如何实现的。
ps:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置的,所以,为它们提供
willSet
或didSet
实现是不恰当。
此外还要注意,你不可以同时提供重写的 setter 和重写的属性观察器。如果你想观察属性值的变化,并且你已经为那个属性提供了定制的 setter,那么你在 setter 中就可以观察到任何值变化了。
防止重写
你可以通过把方法,属性或下标脚本标记为final
来防止它们被重写,只需要在声明关键字前加上final
修饰符即可.(例如:final var
,final func
,final class func
,以及final subscript
)。
你可以通过在关键字class
前添加final
修饰符(final class
)来将整个类标记为 final
的。
要点总结
在属性重写的时候要注意的是:super的只读属性可以被重写成只读和读写而读写属性不能被重写成只读。白话来说就是,在下游可以放宽上游,但不可以缩窄上游。
重写属性,get和set重写后父类的get和set不会再被调用
willSet和didSet重写后父类的willSet和didSet还会继续被调用,而调用属性是先父类后子类