1).繼承的概念和語法
繼承是面向?qū)ο箫@著的一個特性,指從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能拓展新的能力。
術(shù)語:
基類(父類、超類)
派生類(子類、繼承類)
swift繼承的語法:
class ChildClass : FatherClass {
}
繼承優(yōu)點:
- 代碼重用
繼承缺點:
- 增加代碼耦合度
- 父類的改變會影響子類
注意:swift同oc一樣,沒有多繼承
代碼實例:
class Human {
var age = 0
}
class Woman: Human {
}
let nana = Woman()
nana.age = 10
2).super關(guān)鍵字
class Human {
func eatFunc() {
}
}
class birthFunc: Human {
func birth() {
eatFunc() // 從當(dāng)前類開始查找
super.eatFunc() //從當(dāng)前類的父類開始查找
}
}
3).重寫方法
如果派生類中有方法或者屬性命名跟基類中的一模一樣,則可以進(jìn)行屬性或者方法重寫
swift中重寫方法,需要在前面加上關(guān)鍵字override
class Human {
func eatFunc() {
}
}
class birthFunc: Human {
override func eatFunc() { //重寫基類中的方法
}
}
重寫后,通過子類實例調(diào)用重寫的方法,優(yōu)先調(diào)用子類重寫的方法
重寫時候,如果仍想先調(diào)用父類方法,然后再調(diào)用自己重寫的方法,
可以加上super關(guān)鍵字
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) // 通過子類的對象,來調(diào)用重寫后的方法或者屬性,會優(yōu)先調(diào)用子類中的重寫版本
swift中父類的計算屬性可以在子類中重寫為計算屬性
class Father {
var storeProperty : Int { // 計算屬性
get {
return 10
}
set {
}
}
}
class Child : Father {
override var storeProperty: Int { //子類中重寫屬性,可以把父類中的計算屬性,重寫為計算屬性
get {
return 10
}
set {
}
}
}
基類中的計算屬性和存儲屬性,都可以派生類中重寫為計算屬性
屬性重寫限制:
- 重寫時,在子類中只有set方法沒有g(shù)et方法是否可以:不可以
- 重寫時,父類中只讀的計算/存儲屬性,是否能夠重寫為讀寫計算屬性(子類中權(quán)利變大):可以
- 重寫時,父類中可讀寫的計算/存儲屬性,是否能夠重寫為只讀的計算屬性(子類中權(quán)利變小):不可以
5).重寫屬性觀察器
swift中,本類中,只能給非lazy的變量存儲屬性添加屬性觀察器,不能給計算屬性添加。
但是,可以在子類中,重寫父類的計算屬性的屬性觀察器。
也即,在子類中,既可以重寫父類的存儲屬性的觀察器,也可以重寫父類中的計算屬性的觀察器。
重寫屬性觀察器的限制:
- 不可以給只讀的計算/存儲屬性,在子類中設(shè)定屬性觀察器。
6).final防止方法或者屬性重寫
1.在前面加final關(guān)鍵字
class Father {
final var storeProperty : Int = 0
}
final和override是互斥的
2.當(dāng)在類聲明時,在class關(guān)鍵字前加final,可以防止類被繼承
final class Father {
final var storeProperty : Int = 0
}