13.3 Swift构造器之间的调用规则(构造器链)
/** 13.3-构造器之间的调用规则(构造器链).mp4 */
/** (3)构造器链-指定构造器和便利构造器之间的调用规则
a 指定构造器必须调用其直接基类的指定构造器,不可以调用其直接基类的便利构造器。 b 便利构造器必须调用同类中定义的其它构造器(既可以是指定构造器也可以是便利构造器)。 c 便利构造器必须最终以调用一个指定构造器结束。 指定构造器总是向上代理 便利构造器总是横向代理。 */
class AB { var a:Int var b:Int
// 指定构造方法,不允许出现构造器代理,self.init(...) init(a:Int,b: Int) { self.a = a self.b = b print("Class AB init!") }
// 便利构造方法一定是通过调用其它的构造方法来实现初始化 self.init convenienceinit(a: Int) { // self.a = a // b = 0
self.init(a: a,b:0) }
convenienceinit(b: Int) { // self.init(a: 2,b: 0) self.init(a:8) } }
class CD:AB { var c:Int var d:Int
// 指定构造器 Designated // 构造方法默认不会被继承,基类的存储属性只能通过基类的构造方法来初始化 init(c:Int,d: Int) {
// 派生类的引入的存储属性要先被初始化,然后在调用父类的构造方法对父类的属性进行初始化 self.c = c self.d = d
// 基类的存储属性 super.init(a:0,b: 0)// 只能调用基类的指定构造器 // super.init(b: 0) // 不能调用基类的便利构造器
// 只能调用基类的指定(Designated)构造方法来对基类的属性进行初始化,不能调用便利(Convenience)构造方法 // super.init(b: 0) }
// 便利构造器,只能通过调用本类中的构造器完成初始化,不允许出现super.init... convenienceinit(a: Int,b:Int,c: Int,d:Int) { // 可以调用 self.init(c: c,d: d)
// 不行 // self.c = c // self.d = d // super.init(a: a,b: b) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |