關於繼承中的構造規則是乙個難點。
我的swift新手教程專欄
為什麼要有構造器:為類中自身和繼承來的儲存屬性賦初值。
一、兩種構造器-指定構造器和便利構造器
指定構造器:類中必備的構造器。為全部的屬性賦初值。(有些子類可能不須要顯示宣告,由於預設從基類繼承了)
便利構造器:類中的輔助構造器,通過呼叫指定構造器為屬性賦初值。(僅在必要的時候宣告)
舉例
class food
convenience init()
}
便利構造器通過conveniencekeyword宣告,能夠看到。便利構造器是通過呼叫指定構造器來進行構造的。這也就是乙個關鍵的概念:橫向**。
何為**:就是讓別人幫你幹活
二、構造過程中的規則
(一)構造器鏈就是呼叫構造器的順序
規則例如以下:
1.1、指定構造器必須呼叫其父類的指定構造器
1.2、便利構造器必須呼叫同一類中的指定構造器
1.3、便利構造器必須最後以呼叫乙個指定構造器而結束
總得來說一句話:便利構造器橫向**,指定構造器向上**。
舉個樣例:
class base
convenience init()
}class sub:base
convenience init(consubinput:string)
convenience init()
}
(二)關於構造器的繼承與過載swift中,子類不會預設繼承父類的構造器。
構造器的過載遵循構造器鏈的規則(1.1-1.3)
構造器的繼承規則例如以下:
2.1、假設子類中未定義不論什麼指定構造器,將會自己主動繼承全部父類的指定構造器
2.2、假設子類中提供了全部父類指定構造器,無論是通過規則2.1繼承來的,還是自己定義實現的,它將繼承全部父類的便利構造器。
注意: 子類能夠通過部分滿足規則2.2的方式,使用子類便利構造器來實現父類的指定構造器。
樣例一:
class base
convenience init()
}class sub:base
這裡子類未定義不論什麼構造器,所以滿足規則2.1,2.1,將繼承全部父類的指定構造器和便利構造器
所以能夠這麼呼叫
var instance1 = sub()
var instance2 = sub(baseinput:"newbasevar")
樣例二
class base
init(firstpart:string,secondpart:string)
convenience init()
}class sub:base
}
這裡,子類僅僅是實現了父類的乙個構造器,所以並未繼承便利構造器,也沒有繼承另外乙個指定構造器
僅僅能夠這麼創造例項
var instance = sub(subinput:"subvar",baseinput:"basevar")
(三)基於上述兩個規則,構造過程分為兩個部分階段一
階段二可能這個規則有點抽象。舉個樣例就明確了
class base
}class sub:base
init(subinput:string,baseinput:string)
}
總得來說:當類的例項的記憶體被初始化完畢,也就是呼叫super.init()之後,就完畢了階段一了。
三、編譯器的安全檢查
檢查一指定構造器必須在它所在類的屬性先初始化完畢後才幹把構造任務向上**給父類中的構造器。簡單來說。就是先初始化自己的儲存屬性,在呼叫父類的super.init向上初始化
檢查二
指定構造器必須先向上呼叫父類構造器。在為繼承來的屬性賦初值。
這個非常簡答,如果繼承來個x,你先為x賦值為1了,而在呼叫父類構造器。父類構造器會為x賦另外乙個初值來保證初始化過程完畢,那麼你賦值的1就被覆蓋了
檢查三
便利構造器先呼叫同類中其它構造器,再為隨意屬性賦初值。和檢查二類似。也是防止被覆蓋
檢查四
構造器在第一階段完畢之前。不能飲用self,不能呼叫不論什麼例項屬性,不能呼叫例項方法
四、總結一下
指定構造器的過程是這種
1、為自己的屬性賦初值
2、呼叫基類構造器(super.init)
3、然後就能夠呼叫self,和例項方法,儲存屬性。定製新的值了。
然後,我們看下官方文件裡給出的乙個比較好的樣例
class food
convenience init()
}class recipeingredient: food
override convenience init(name: string)
}class shoppinglistitem: recipeingredient
}
這個構造器鏈的關係如圖
解釋
Swift難點 繼承中的構造規則例項詳解
如有侵犯,請來信oiken qq.com 關於繼承中的構造規則是乙個難點。我的swift入門教程專欄 為什麼要有構造器 為類中自身和繼承來的儲存屬性賦初值。一 兩種構造器 指定構造器和便利構造器 指定構造器 類中必備的構造器,為所有的屬性賦初值。有些子類可能不需要顯示宣告,因為預設從基類繼承了 便利...
java基礎 繼承中的構造方法規則
一 相關規則 1 子類的構造過程中必須呼叫父類的構造方法 2 子類可以在自己的構造方法中使用super argumentlist 來呼叫父類的構造方法 使用this argumentlist 呼叫本類的其他構造方法 如果使用super argumentlist 來呼叫父類的構造方法,必須寫在子類構造...
Swift中的構造方法
注意 swift對類的構造方法有乙個基本的要求,那就是當構造完乙個物件之後,物件中所有的儲存屬性都要被初始化。對構造方法的理解 構造方法的作用是對物件進行初始化,也就是給物件所占用的記憶體進行初始化。但是只有儲存屬性才會真正地佔據記憶體。所以,構造方法的最主要目的是將所有的儲存屬性設定初始值。即乙個...