iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
0

https://ithelp.ithome.com.tw/upload/images/20181101/20110801Qd0iXDQvkz.png

繼承 ( inherit ) 這個概念主要是類別 ( class ) 在使用,是物件導向的一個重要特性。一個類別可以繼承另一個類別的屬性 ( property )、方法 ( method ) 及其他特性。

一個類別繼承其他類別時,這個類別會被稱為子類別 ( subclass )。被繼承的類別則是稱為父類別 ( superclass,直翻會是超類別,但還是以父類別為主,以與子類別相對應 )。

基礎類別

基礎類別 ( base class ) 就是不繼承於其它類別的類別。
Swift 中沒有一個通用的基礎類別,只要一個類別沒有繼承於其他類別,這個類別即為一個基礎類別。
以下先定義一個基礎類別,其實就是一個普通的類別:

https://ithelp.ithome.com.tw/upload/images/20181101/20110801xsCITgxv4S.png

上述程式為一個基礎的遊戲角色職業類別,僅是定義了一些通用的內容,接著需要再定義子類別來完備。

生成子類別

生成子類別 ( subclassing ) 指的是基於一個基礎類別來定義一個新的類別,子類別會繼承父類別所有的特性,且還可以增加新的特性。
使用方式為在類別名稱後面加上冒號:,接著寫上父類別名稱:

class 子類別: 父類別{
子類別定義內容
}

以下是個例子,這邊定義一個繼承自類別 GameCharacter 的新類別Archer:

https://ithelp.ithome.com.tw/upload/images/20181101/20110801oDyYdOXoLR.png

一個子類別仍然可以再被其他類別繼承,以下再定義一個類別Hunter,繼承自類別Archer:

https://ithelp.ithome.com.tw/upload/images/20181101/20110801e2x7KFAfWq.png

覆寫

類別繼承的同時,子類別可以重新定義父類別中定義過的特性,如實體方法 ( instance method )、型別方法 ( type method )、實體屬性 ( instance property )、型別屬性 ( type property ) 或下標 ( subscript ),這種行為即是覆寫 ( overriding )。
使用關鍵字 override 來表示你要覆寫這個特性 ( 即方法、屬性或下標 )。

覆寫方法

以下為一個覆寫方法的例子:

https://ithelp.ithome.com.tw/upload/images/20181101/20110801vMOUUppLlt.png

覆寫屬性

覆寫屬性時,需要使用getter(以及有時可省略的setter)來覆寫繼承來的屬性,且一定要寫上屬性的名稱及型別,這樣才能確定是從哪一個屬性繼承而來的。

可以將一個繼承來的唯讀屬性覆寫為一個讀寫屬性,但不行將一個讀寫屬性覆寫為唯獨屬性。即原本有setter的話,覆寫時就一定要有setter

https://ithelp.ithome.com.tw/upload/images/20181101/20110801U5qy2IOoEZ.png

覆寫屬性觀察器

覆寫屬性時,通常可以加上屬性觀察器 ( property observer ),但以下兩點要注意:
・當繼承的屬性為常數儲存型屬性或唯讀計算型屬性時,不能加上屬性觀察器,因為這兩者的屬性無法再被設置,所以willSet跟didSet對它們沒有意義。
・覆寫時不能同時有setter跟屬性觀察器(willSet跟didSet),因為setter中即可做到屬性觀察器的功能要求。

雖然說是覆寫,但如果覆寫的父類別屬性也有屬性觀察器,其實子類別跟父類別兩者的屬性觀察器都會被執行:

https://ithelp.ithome.com.tw/upload/images/20181101/20110801wBinQoAN9I.png

上述程式中可以知道,willSet 觸發時,會先執行子類別的再來才是父類別的,而 didSet 則是相反,先執行父類別的再來才是子類別的

存取父類別的屬性,方法及下標

在前面章節介紹類別的時候,提到類別有一個隱藏的內建屬性 self,可以在方法中代表類別本身。而當繼承自另一個類別時,可以使用 super 屬性來存取父類別的屬性、方法或下標。

https://ithelp.ithome.com.tw/upload/images/20181101/20110801qvV9DqFZ1P.png

防止覆寫

可以在類別的方法、屬性或下標前面加上 final,來防止它們被覆寫,使用方式為 final var、final func 或是 final class func 這樣。
甚至也可以在整個類別的關鍵字 class 前面加上 final,這樣整個類別都不能再被繼承。


上一篇
Swift 4.2 Day-16 subscript
下一篇
Swift 4.2 Day-18 initializer & deinitializer
系列文
菜比八iOS程式開發30天自我挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言