20170614基礎知識-類繼承

1、Swift中,繼承只能發(fā)生在類上,一個類可以繼承另一個類的方法、屬性、下標等特征。

class 子類:父類 {}

override init() 可以重寫父類構造函數

Swift中,類的繼承只能是單繼承,多重繼承可以通過遵從協議實現,一個類只能集成一個父類,但是可以遵從多個協議

2、構造函數繼承

向上代理:繼承時,在子類構造過程中,要先調用父類構造函數,初始化父類的存儲屬性。指定構造函數

3、Swift限制構造函數之間代理調用的規(guī)則:

①指定構造函數,必須調用其直接父類的指定構造函數

②便利構造函數,必須調用同一類中定義的其他構造函數

③便利構造函數,必須最終以調用一個指定構造函數結束

4、構造過程兩個階段:

階段一:分配內存→初始化子類存儲屬性→初始化父類存儲屬性→初始化全部的父類存儲屬性

第一階段構造完成的標志:super.init或者self.init

階段二:對每個類進行進一步修改存儲屬性、調用實例方法等處理

構造過程安全檢查:

①指定構造函數必須保存其所在類的所有存儲屬性都完成初始化,才能向上調用父類構造函數代理

②指定構造函數必須先向上調用父類構造函數代理,然后再為繼承的屬性設置新值,否則新值將被父類中的構造函數所覆蓋

③便利構造函數必須先調用同一類中的其他構造函數代理,然后再為任意屬性賦值,否則新值將被同一類中其他指定構造函數覆蓋

④構造函數在第一階段構造完成之前,不能調用實例方法,也不能讀取實例屬性

5、構造函數繼承

條件1:子類沒有定義任何指定構造函數,則自動繼承父類的所有指定構造函數

條件2:如果子類提供了所有父類指定構造函數的實現,無論是通過條件1擊沉改過來的,還是通過自己編寫的,都自動繼承父類所有的便利構造函數

6、繼承后的重寫

①重寫實例屬性

可以重寫Getter、Setter訪問器,可以重寫屬性觀察者;子類繼承父類時,可以通過Getter、Setter訪問器,重寫父類的存儲屬性和計算屬性。

屬性的重寫,看出:子類本身并不存儲數據,數據存儲在父類的存儲屬性中

一個屬性重寫了觀察者(willSet,didSet)之后,就不能再重寫Getter、Setter,常量屬性、只讀計算屬性不能重寫觀察者

②重寫靜態(tài)屬性

class屬性的可以被重寫,static屬性的不能被重寫

③重寫實例方法

override 父類方法 {}

④重寫靜態(tài)方法

class屬性的可以被重寫,static屬性的不能被重寫

靜態(tài)方法中,不能訪問實例屬性

⑤下標重寫

重寫下標的get、set

7、final關鍵字

final class ,final聲明的類,不能被繼承,final聲明的屬性、方法、下標,不能被重寫

8、類型檢查與轉換(父類類型轉換成為子類類型,向下轉型;子類類型轉換為父類類型,向上轉型)

is : 判斷一個實例是否是某個類的類型

as:僅僅應用于向上轉型 ?let a : Student = Student() ?let b : Person = a as b

as!:對可選值拆包,將非可選類型轉換為可選類型,將可選類型轉換為非可選類型,如果不能轉換為目標類型,會出現運行時錯誤

as?:不進行拆包,將非可選類型轉換為可選類型,將可選類型轉換為可選類型,如果不能轉換為目標地類型,則值為nil

as?是在不確定類型轉換是否成功的情況下使用,如果成功轉換,結果是可選類型;如果能確保轉換一定成功,可以使用as!在轉換的同時進行隱式拆包

9、不確定類型

AnyObject:任何類的類型

Any:任何類型,包括類和其他數據類型

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容