Swift Review#22[繼承Inherit-覆寫屬性觀察器(property observer)、防止複寫(final class)]

--

前言

繼上一篇回顧了繼承(Inherit)的主要概念:「即子承父類,而子另有所圖,故可因其所欲改變子之內涵。」(其這個字說的不精確,到底是子呢?還是開發者呢?)

總之。這句話也大抵上涵蓋了「覆寫」(override)的意義。繼承的子類可為原先父類的樣子,也可為經過覆寫後的模樣,進而本篇接下來要提到的重點,會放在:

  1. 覆寫屬性觀察器(property observe)
  2. 防止覆寫

正文

覆寫屬性觀察性

承繼Swift起步走對於覆寫屬性觀察性的描述:

覆寫屬性時,通常可以加上屬性觀察器(property observer),但以下兩點要注意:

  • 當繼承的屬性為常數儲存型屬性(以let開頭宣告的constant)唯讀計算型屬性時,不能加上屬性觀察器,因為這兩者的屬性無法再被設置,所以willSetdidSet對它們沒有意義。
  • 覆寫時不能同時有setter跟屬性觀察器(willSetdidSet),因為setter中即可做到屬性觀察器的功能要求。

從以下例子可以知道,若覆寫的父類別有屬性觀察器,則,子、父兩類別的屬性觀察器都會被執行,如下:

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

而Iceman繼承了Magician,則仍有屬性觀察器,且若是依此填入speed的數字,則會一起觸發子、父類別的屬性觀察器。

防止覆寫的Final標示

在開發的過程中,可以以Final這個字眼作為是最後的父類內容,下一個子類則不被它繼承。

而所謂不被繼承的內容指的是什麼呢?

不管是類別(class)、屬性(property)、下標()都可以讓他們不再被覆寫,所以大概會是下面這樣的字樣:final var 、final func、final class func

或者假若你要整個類別都不再被覆寫,可以在類別的class前以final class宣告它就是不能再被繼承了!

100 Days of Swift指出:

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是不是有點關係?

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

影山小麥機
影山小麥機

Written by 影山小麥機

本職為Mobile工程師,熱愛分享視野,也樂意站在ChatGPT的肩膀上。訂閱小麥機,收割技術、職涯、人生的難題。

No responses yet

Write a response