温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

构造器继承

发布时间:2020-07-22 18:33:41 来源:网络 阅读:792 作者:hehemmm 栏目:开发技术

        在构造器中可以使用构造代理器来完成部分构造工作,类构造器代理分为横向代理和向上代理,横向代理只能发生在同一类内部,这种构造器称为便利构造器,向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造器初始化父类的存储属性,这种构造器称为指定构造器


        一、构造器调用规则

        1、指定的构造器必须调用其直接父类的指定构造器;

        2、便利构造器必须调用其同一类中的其他构造器;

        3、便利构造器必须最终调用一个指定构造器结束;

    class person {
                var name:String 
                var age : Int 
                
                func description()->String {
                        return "\(name):\(age)"
}
                convenienece init(){
                    self.init(name:"HEHE")
                    self.age=10
}
                convenience init(name:String){
                    self.init(name:name,age:10)
}
                init(name:String,age:Int){
                    self.name=name
                    self.age=age
}

     

       class Studetn:Person {
                var school:String 
                init(name:String,age:Int,school:String){
                        self.school=school
                        super.init(name:name,age:age)
                }
                
                convenienece override init(name:String,age:Int){
                        self.init(name:name,age:age,school:"XXXX")
}
}


        二、构造过程安全检查

            

            1、首先分配内存,初始化子类存储属性,沿构造器链向上初始化父类存储属性,到达构造器链顶部,初始化全部的存储属性;

            2、从顶部构造链往下,可以对类进行进一步的修改存储属性,调用实例方法等处理;


            Swift的编译器在构造过程中可以运行一些安全检查工作,这些工作可以有效的防止属性在初始化前被访问,也可以防止属性被其它的一些构造器赋予不同的值;


            安全检查1:指定构造器必须保证其所在类的所有存储属性都初始化完成,之后才能向上调用父类构造器代理;

            

            安全检查2:指定构造器必须先调用父类构造器代理,再为继承的属性赋予新值,否则指定构造器赋予的新值都会被父类中的构造器所覆盖;


            安全检查3:便利构造器必须先调用同一类中的其他构造器代理,然后再为任意属性赋新值,否则便利构造器赋予的值将被同一类中的其他指定构造器所覆盖;


            安全检查4:构造器在第一阶段构造完成之前,不能调用实例方法,也不能读取实例属性;


            


        三、构造器继承


                Swift中子类构造器的来源有2种,自己编写和从父类继承,并不是所有父类的构造器都能自动继承下来,能够从父类自动继承下来的构造器,规则如下:


            1、如果子类没有定义任何指定构造器,它将自动继承父类的所有指定构造器;

            2、如果子类提供了所有父类指定构造器的实现,无论是通过条件1继承而来,还是自己编写,它将自动继承所有父类的便利构造器;


            class Graduate:Studetn {

                var special:String = ""

}

            

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI