继承可以理解为一个类获取了另外一个类的方法和属性。当一个类继承其他类时,继承类叫子类,被继承类叫超类(或父类)。在swift中,类可以调用和访问超类的方法、属性和下表脚本,并且可以重写它们,也可以为类中继承来的属性添加属性观察器。
继承是面向对象最显著的一个特性,继承是从已有的类中派生出新的类,新的类能够继承已有类的属性和方法,并扩展新的能力
术语:基类(父类、超类),派生类(子类、继承类)
语法
1 | class 子类: 父类{ |
优缺点
- 优点:代码重用
- 缺点:增加程序耦合度,父类改变会影响子类
- 注意点:Swift和OC一样没有多继承
例子
1 | class Man { |
super关键字
子类(派生类)可以通过super关键字来引用父类的属性和方法
1 | class Man { |
override重写
override关键字主要为了明确表示重写父类方法,所以如果重写父类方法,必须加上override关键字
1 | class Son2: Man { |
重写属性
1 | class Man1 { |
重写属性的限制
- 读写计算属性/存储属性,是否可以重写为只读计算属性?
(权限变小,不可以)
错误信息:// Cannot override mutable property with read-only property ‘xxx’ - 只读计算属性,是否可以在重写变成读写计算属性?
(权限变大,可以)
1 | class Man3 { |
重写属性观察器
可以在属性重写中为一个继承来的属性添加属性观察器,那么当继承来的属性值发生改变时,就会检测到。
注意点:只能给非lazy属性存储属性设定属性观察器,不能给计算属性设置属性观察器,给计算属性设置观察器没有意义。这句话可能给人一个误解,给计算属性设置属性观察器不是不能,只是添加了没意义。
属性观察器限制:
- 不能在子类中重写父类只读的存储属性
- 不能给lazy的属性设置属性观擦器
1 | class Man4 { |
防止重写
利用final关键字防止重写,final关键字既可以修饰属性,也可以修饰方法,并且还可以修饰类。
- 被final关键字修饰的属性和方法不能被重写
- 被final关键字修饰的类不能被继承
1 | final class Man5 { |