溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

構(gòu)造器繼承

發(fā)布時間:2020-07-22 18:33:41 來源:網(wǎng)絡(luò) 閱讀:792 作者:hehemmm 欄目:開發(fā)技術(shù)

        在構(gòu)造器中可以使用構(gòu)造代理器來完成部分構(gòu)造工作,類構(gòu)造器代理分為橫向代理和向上代理,橫向代理只能發(fā)生在同一類內(nèi)部,這種構(gòu)造器稱為便利構(gòu)造器,向上代理發(fā)生在繼承的情況下,在子類構(gòu)造過程中,要先調(diào)用父類構(gòu)造器初始化父類的存儲屬性,這種構(gòu)造器稱為指定構(gòu)造器


        一、構(gòu)造器調(diào)用規(guī)則

        1、指定的構(gòu)造器必須調(diào)用其直接父類的指定構(gòu)造器;

        2、便利構(gòu)造器必須調(diào)用其同一類中的其他構(gòu)造器;

        3、便利構(gòu)造器必須最終調(diào)用一個指定構(gòu)造器結(jié)束;

    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")
}
}


        二、構(gòu)造過程安全檢查

            

            1、首先分配內(nèi)存,初始化子類存儲屬性,沿構(gòu)造器鏈向上初始化父類存儲屬性,到達(dá)構(gòu)造器鏈頂部,初始化全部的存儲屬性;

            2、從頂部構(gòu)造鏈往下,可以對類進(jìn)行進(jìn)一步的修改存儲屬性,調(diào)用實例方法等處理;


            Swift的編譯器在構(gòu)造過程中可以運行一些安全檢查工作,這些工作可以有效的防止屬性在初始化前被訪問,也可以防止屬性被其它的一些構(gòu)造器賦予不同的值;


            安全檢查1:指定構(gòu)造器必須保證其所在類的所有存儲屬性都初始化完成,之后才能向上調(diào)用父類構(gòu)造器代理;

            

            安全檢查2:指定構(gòu)造器必須先調(diào)用父類構(gòu)造器代理,再為繼承的屬性賦予新值,否則指定構(gòu)造器賦予的新值都會被父類中的構(gòu)造器所覆蓋;


            安全檢查3:便利構(gòu)造器必須先調(diào)用同一類中的其他構(gòu)造器代理,然后再為任意屬性賦新值,否則便利構(gòu)造器賦予的值將被同一類中的其他指定構(gòu)造器所覆蓋;


            安全檢查4:構(gòu)造器在第一階段構(gòu)造完成之前,不能調(diào)用實例方法,也不能讀取實例屬性;


            


        三、構(gòu)造器繼承


                Swift中子類構(gòu)造器的來源有2種,自己編寫和從父類繼承,并不是所有父類的構(gòu)造器都能自動繼承下來,能夠從父類自動繼承下來的構(gòu)造器,規(guī)則如下:


            1、如果子類沒有定義任何指定構(gòu)造器,它將自動繼承父類的所有指定構(gòu)造器;

            2、如果子類提供了所有父類指定構(gòu)造器的實現(xiàn),無論是通過條件1繼承而來,還是自己編寫,它將自動繼承所有父類的便利構(gòu)造器;


            class Graduate:Studetn {

                var special:String = ""

}

            

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI