您的位置:首页 > 移动开发 > Swift

13.4 Swift派生类构造方法的两段式构造

2016-12-22 10:50 218 查看
        /**

         13.4-派生类构造方法的两段式构造

         */

        

        /**

         两段式构造-构造过程可以划分为两个阶段

         第一阶段,确保所有的存储属性都初始化完毕,

         第二阶段,对父类中的存储属性做进一步的处理。

         可以防止属性在被初始化之前访问,也可以防止属性被另外一个构造器意外的赋值。

         */

        

        class A {

            var a:
Int

            init(a:
Int) {

                self.a = a

            }

            

        }

        

        class B:
A {

            var b:
Int

            

            func testFun() ->
Void {

                print("testFun")

            }

            

            init(a:
Int, b: Int) {

                // 派生类引入的属性进行初始化

                print("类B第一阶段初始化开始")

                self.b = b

                

                /** 第一阶段

                 (1)不可以访问父类中的属性

                 (2)不可以调用成员方法

                 */

//                testFun()

                

                // 父类的指定构造方法对父的属性进行初始化

                super.init(a: a)

                

                print("类B第二阶段初始化开始")

                if b >
100 {

                    self.a =
1000

                }

                

                testFun()

            }

        }

        

        

        class C:
B {

            var c:
Int

            init(a:
Int, b: Int, c:
Int) {

                

                // 派生类引入的属性进行初始化

                print("类C第一阶段初始化开始")

                self.c = c

                

                // 父类的指定构造方法对父的属性进行初始化

                super.init(a: a, b: b)

                print("类C第二阶段初始化开始")

                if c >
100 {

                    self.a =
1000

                    self.b =
1000

                }

            }

        }

        

        class D:
C {

            var d:
Int

            init(a:
Int, b: Int, c:
Int, d: Int) {

                // 派生类引入的属性进行初始化

                print("类D第一阶段初始化开始")

                self.d = d

                

                super.init(a: a, b: b, c: c)

                

                print("类D第二阶段初始化开始")

                if d >
1000 {

                    self.a =
1000

                    self.b =
1000

                    self.c =
1000

                }

            }

        }

        

        var d =
D.init(a:
0, b: 0, c:
0, d: 0)

        

        /**

         类D第一阶段初始化开始

         类C第一阶段初始化开始

         类B第一阶段初始化开始

         类B第二阶段初始化开始

         类C第二阶段初始化开始

         类D第二阶段初始化开始

         */

        /**

         可以防止属性在被初始化之前访问,也可以防止属性被另外一个构造器意外的赋值。

         */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: