前言
繼上一篇回顧了繼承(Inherit)的主要概念:「即子承父類,而子另有所圖,故可因其所欲改變子之內涵。」(其這個字說的不精確,到底是子呢?還是開發者呢?)
總之。這句話也大抵上涵蓋了「覆寫」(override)的意義。繼承的子類可為原先父類的樣子,也可為經過覆寫後的模樣,進而本篇接下來要提到的重點,會放在:
- 覆寫屬性觀察器(property observe)
- 防止覆寫
正文
覆寫屬性觀察性
承繼Swift起步走對於覆寫屬性觀察性的描述:
覆寫屬性時,通常可以加上屬性觀察器(property observer
),但以下兩點要注意:
- 當繼承的屬性為常數儲存型屬性(以let開頭宣告的constant)或唯讀計算型屬性時,不能加上屬性觀察器,因為這兩者的屬性無法再被設置,所以
willSet
跟didSet
對它們沒有意義。 - 覆寫時不能同時有
setter
跟屬性觀察器(willSet
跟didSet
),因為setter
中即可做到屬性觀察器的功能要求。
從以下例子可以知道,若覆寫的父類別有屬性觀察器,則,子、父兩類別的屬性觀察器都會被執行,如下:

Magician繼承了Fighter之後,覆寫了speed的屬性,加入willSet、didSet兩者。

而Iceman繼承了Magician,則仍有屬性觀察器,且若是依此填入speed的數字,則會一起觸發子、父類別的屬性觀察器。
防止覆寫的Final標示
在開發的過程中,可以以Final這個字眼作為是最後的父類內容,下一個子類則不被它繼承。
而所謂不被繼承的內容指的是什麼呢?
不管是類別(class)、屬性(property)、下標()都可以讓他們不再被覆寫,所以大概會是下面這樣的字樣:final var 、final func、final class func
或者假若你要整個類別都不再被覆寫,可以在類別的class前以final class宣告它就是不能再被繼承了!
Swift gives us a final
keyword just for this purpose: when you declare a class as being final, no other class can inherit from it. This means they can’t override your methods in order to change your behavior – they need to use your class the way it was written.
累積的問題
作者到底是怎麼推論屬性觀察器willSet會先執行子類別再父類別的?而didSet相反,它是先父類別再執行子類別的?
唯讀計算型屬性具體指的是什麼呢?它實際的樣子是怎麼樣呢?
getter、setter跟willSet、didSet是不是有點關係?