繼承
Swift中默認(rèn)情況下灰追,子類不會自動繼承父類的構(gòu)造器,只有在安全和適當(dāng)?shù)那闆r下拟淮,子類會自動繼承父類的構(gòu)造器干茉。
安全適當(dāng)?shù)那闆r是指:(官方的表述是有錯誤的),第二條并不是必須子類的屬性要有默認(rèn)值惩歉,在實現(xiàn)的構(gòu)造器中等脂,子類完成自己的屬性初始化就行
- 子類中的新屬性都有默認(rèn)值,子類沒有定義任何指定構(gòu)造器,子類將自動獲得所有父類的指定構(gòu)造器
- 子類實現(xiàn)了父類所有的指定構(gòu)造器(不一定是重寫撑蚌,繼承的也算),子類將自動獲得父類的所有便利構(gòu)造器
第一條很好理解搏屑,子類沒有指定構(gòu)造器并且自己的屬性都有默認(rèn)值争涌,所以直接調(diào)用父類的指定構(gòu)造器就可以完成初始化,所以會繼承
第二條也很好理解辣恋,子類實現(xiàn)了父類的所有指定構(gòu)造器亮垫,子類獲得的便利構(gòu)造器,可以保證子類實例初始化伟骨,因為饮潦,這些便利構(gòu)造器最終要調(diào)用到本類中的指定構(gòu)造器,因為子類重寫了所有父類指定構(gòu)造器携狭,所有繼承來的便利構(gòu)造器最終在子類中一定可以找到指定構(gòu)造器完成完全初始化
第一種情況
class A{
var a:Int
init(a:Int) {
self.a = a
}
convenience init() {
self.init(a:1)
}
}
class B: A {
var b = 2
}
var b1 = B(a: 1)//類B中的b有默認(rèn)值2继蜡,所以獲得類A中的指定構(gòu)造器init(a:int)
var b2 = B()//類B實現(xiàn)了類A中的init(a:Int),所以會得到類A的便利構(gòu)造器init()
class A{
var a:Int
init(a:Int) {
self.a = a
}
convenience init() {
self.init(a:1)
}
}
class B: A {
var b:Int
override init(a:Int){
self.b = 1
super.init(a:a)
}
}
var b = B(a: 1)
var b2 = B()
重寫
如果在子類中有和父類一樣的構(gòu)造器逛腿,子類構(gòu)造器必須加上override關(guān)鍵字稀并,因為此時你在重寫父類的構(gòu)造器。
那么編譯器如何認(rèn)為兩個構(gòu)造器是否相同单默?
即原型相同碘举,原型包含名稱和參數(shù)表,名稱都是init搁廓,不用考慮引颈,參數(shù)表是指參數(shù)個數(shù)耕皮,參數(shù)類型,參數(shù)順序蝙场,還有參數(shù)標(biāo)簽明场,只有都相同才認(rèn)為是相同的構(gòu)造器
另外需要注意的一點是,子類的構(gòu)造器和父類的便利構(gòu)造器相同的時候李丰,不叫重寫苦锨,不須加override關(guān)鍵字,因為在子類中無法調(diào)用父類的便利構(gòu)造器趴泌,所以這不是重寫