zoukankan      html  css  js  c++  java
  • Swift中类的两段式构造(类的构造过程)

    import Foundation
    
    /*
    类的构造需要两个阶段:
    第一阶段:
    1.程序调用子类的某个构造器
    2.为实例分配内存, 此时实例的内存还没有被初始化
    3.指定构造器确保子类定义的所有实例存储属性都已被赋初值
    4.指定构造器将调用父类的构造器, 完成父类定义的实例存储属性的初始化
    5.沿着调用父类构造器的构造器链一直往上执行, 直到到达构造器链的最顶部
    第二阶段:
    1.沿着继承树往下, 构造器此时可以修改实例属性和访问self, 甚至可以调用实例方法
    2.最后, 构造器链中的便利构造器都有机会定制实例和使用self
    
    为了使得构造过程更加安全, Swift进行了安全检查
    安全检查1:指定构造器必须先初始化当前类中定义的实例存储属性, 然后才能向上调用父类构造器
    安全检查2:指定构造器必须向上调用父类构造器, 然后才能对继承得到的属性赋值
    安全检查3:便利构造器必须先调用同一个类的其他构造器, 然后才能对属性赋值
    安全检查4:构造器在第一阶段完成之前, 不能调用实例方法, 不能读取实例属性
    */
    
    class Person {
        
        var name: String!
        var weight: Double
        
        // 定义指定构造器
        init(name: String, weight: Double) {
            self.name = name
            self.weight = weight
        }
        
        // 定义便利构造器(使用convenience修饰)
        convenience init(n name: String, w weight: Double) {
            self.init(name: name, weight: weight)
        }
    }
    
    class Man: Person {
        
        var sex: String!
        
        init(sex: String, name: String, weight: Double) {
            // print(super.name) 不能再父类初始化之前调用父类中的属性
            super.init(name: name, weight: weight)
            super.name = "lala"
            print(self.name)
            // print(self.sex) 不能在本类中的属性没有进行初始化的时候进行调用
            // 会出现:fatal error: unexpectedly found nil while unwrapping an Optional value错误
            self.sex = sex
            print(self.sex)
        }
        
        convenience init(s sex: String, n name: String, weight: Double) {
            
            // 在调用其他构造器之前, 不能访问或修改任何实例存储属性
            // print(self.name) 错误
            // super.name = name 错误
            self.init(sex: sex, name: name, weight: weight)
        }
    }
    
    var man = Man(sex: "男", name: "Rinpe", weight: 62.0)
    
  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/Rinpe/p/5189058.html
Copyright © 2011-2022 走看看