1).继承的概念和语法
继承是面向对象显著的一个特性,指从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能拓展新的能力。
术语:
基类(父类、超类)
派生类(子类、继承类)
swift继承的语法:
class ChildClass : FatherClass {
}
继承优点:
- 代码重用
继承缺点:
- 增加代码耦合度
- 父类的改变会影响子类
注意:swift同oc一样,没有多继承
代码实例:
class Human {
var age = 0
}
class Woman: Human {
}
let nana = Woman()
nana.age = 10
2).super关键字
class Human {
func eatFunc() {
}
}
class birthFunc: Human {
func birth() {
eatFunc() // 从当前类开始查找
super.eatFunc() //从当前类的父类开始查找
}
}
3).重写方法
如果派生类中有方法或者属性命名跟基类中的一模一样,则可以进行属性或者方法重写
swift中重写方法,需要在前面加上关键字override
class Human {
func eatFunc() {
}
}
class birthFunc: Human {
override func eatFunc() { //重写基类中的方法
}
}
重写后,通过子类实例调用重写的方法,优先调用子类重写的方法
重写时候,如果仍想先调用父类方法,然后再调用自己重写的方法,
可以加上super
关键字
class Human {
func eatFunc() {
}
}
class birthFunc: Human {
override func eatFunc() { //重写基类中的方法
super.eatFunc()
}
}
4).重写属性
swift中父类的存储属性可以在子类中重写为计算属性,但是不可以重写为存储属性
class Father {
var storeProperty = 3 // 存储属性
}
class Child : Father {
override var storeProperty: Int { //类中重写属性,可以把父类中的存储属性,重写为计算属性
get {
return 10
}
set {
print("storeProperty")
}
}
}
var child = Child()
print(child.storeProperty) // 通过子类的对象,来调用重写后的方法或者属性,会优先调用子类中的重写版本
swift中父类的计算属性可以在子类中重写为计算属性
class Father {
var storeProperty : Int { // 计算属性
get {
return 10
}
set {
}
}
}
class Child : Father {
override var storeProperty: Int { //子类中重写属性,可以把父类中的计算属性,重写为计算属性
get {
return 10
}
set {
}
}
}
基类中的计算属性和存储属性,都可以派生类中重写为计算属性
属性重写限制:
- 重写时,在子类中只有set方法没有get方法是否可以:不可以
- 重写时,父类中只读的计算/存储属性,是否能够重写为读写计算属性(子类中权利变大):可以
- 重写时,父类中可读写的计算/存储属性,是否能够重写为只读的计算属性(子类中权利变小):不可以
5).重写属性观察器
swift中,本类中,只能给非lazy的变量存储属性添加属性观察器,不能给计算属性添加。
但是,可以在子类中,重写父类的计算属性的属性观察器。
也即,在子类中,既可以重写父类的存储属性的观察器,也可以重写父类中的计算属性的观察器。
重写属性观察器的限制:
- 不可以给只读的计算/存储属性,在子类中设定属性观察器。
6).final防止方法或者属性重写
1.在前面加final
关键字
class Father {
final var storeProperty : Int = 0
}
final
和override
是互斥的
2.当在类声明时,在class
关键字前加final
,可以防止类被继承
final class Father {
final var storeProperty : Int = 0
}