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)

            }

        }








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值