一個(gè)類可以從另一個(gè)類繼承方法盐类,屬性和其他特征。當(dāng)一個(gè)類從另一類繼承時(shí)呛谜,繼承的類稱為子類在跳,而其繼承的類稱為其超類。繼承是一種基本行為隐岛,可將Swift中的類與其他類型區(qū)分開猫妙。
Swift中的類可以調(diào)用和訪問屬于其超類的方法,屬性和下標(biāo)聚凹,并且可以提供這些方法割坠,屬性和下標(biāo)的自己的重寫版本以完善或修改其行為。Swift通過(guò)檢查覆蓋定義是否具有匹配的超類定義來(lái)幫助確保覆蓋是正確的妒牙。
類還可以將屬性觀察器添加到繼承的屬性中彼哼,以便在屬性值更改時(shí)得到通知∠娼瘢可以將屬性觀察器添加到任何屬性敢朱,而不管其最初是定義為存儲(chǔ)屬性還是計(jì)算屬性。
定義基類
任何不從另一個(gè)類繼承的類都稱為基類摩瞎。Swift類不從通用基類繼承拴签。您未指定超類而定義的類將自動(dòng)成為基礎(chǔ)類供您構(gòu)建。
子類化
子類化是在現(xiàn)有類的基礎(chǔ)上建立新類的行為旗们。子類繼承現(xiàn)有類的特征蚓哩,然后可以對(duì)其進(jìn)行優(yōu)化。您還可以向子類添加新的特征上渴。
覆寫
子類可以提供其自己的實(shí)例方法岸梨,類型方法喜颁,實(shí)例屬性,類型屬性或下標(biāo)的自定義實(shí)現(xiàn)盛嘿,否則該實(shí)例方法將從超類繼承洛巢。這稱為覆蓋。
要覆蓋原本會(huì)被繼承的特征次兆,請(qǐng)?jiān)诟采w定義的前面加上override關(guān)鍵字稿茉。
訪問超類的方法,屬性和下標(biāo)
當(dāng)您為子類提供方法芥炭,屬性或下標(biāo)替代時(shí)漓库,將現(xiàn)有的超類實(shí)現(xiàn)用作替代的一部分有時(shí)會(huì)很有用。例如园蝠,您可以優(yōu)化該現(xiàn)有實(shí)現(xiàn)的行為渺蒿,或者將修改后的值存儲(chǔ)在現(xiàn)有的繼承變量中。
在適當(dāng)?shù)那闆r下彪薛,您可以使用super前綴訪問方法茂装,屬性或下標(biāo)的超類版本:
重寫方法someMethod()可以在someMethod()中通過(guò)super.someMethod()在重寫方法實(shí)現(xiàn)中調(diào)用來(lái)調(diào)用的超類版本。
被稱為覆蓋的屬性someProperty可以訪問的超類版本someProperty作為super.someProperty壓倒一切的getter或setter實(shí)現(xiàn)中善延。
覆蓋下標(biāo)someIndex可以從覆蓋下標(biāo)實(shí)現(xiàn)中訪問同一下標(biāo)的超類版本super[someIndex]少态。
覆蓋方法
您可以重寫繼承的實(shí)例或類型方法,以在子類中提供該方法的定制或替代實(shí)現(xiàn)易遣。
覆蓋屬性
您可以覆蓋繼承的實(shí)例或類型屬性彼妻,以為該屬性提供自己的自定義getter和setter,或添加屬性觀察器以使覆蓋的屬性能夠在基礎(chǔ)屬性值更改時(shí)進(jìn)行觀察豆茫。
覆蓋屬性獲取器和設(shè)置器
您可以提供一個(gè)自定義的getter(如果合適的話侨歉,可以使用setter)來(lái)覆蓋任何繼承的屬性,而不管該繼承的屬性是在源上實(shí)現(xiàn)為存儲(chǔ)屬性還是計(jì)算屬性揩魂。子類不知道繼承屬性的存儲(chǔ)或計(jì)算性質(zhì)幽邓,它僅知道繼承屬性具有特定名稱和類型。您必須始終聲明要覆蓋的屬性的名稱和類型火脉,以使編譯器能夠檢查您的覆蓋是否與具有相同名稱和類型的超類屬性匹配颊艳。
通過(guò)在子類屬性重寫中同時(shí)提供getter和setter,可以將繼承的只讀屬性表示為讀寫屬性忘分。但是棋枕,您不能將繼承的讀寫屬性表示為只讀屬性。
如果在屬性替代中提供了一個(gè)setter妒峦,則還必須為該替代提供一個(gè)getter重斑。如果您不想在覆蓋的getter中修改繼承的屬性的值,則可以簡(jiǎn)單地通過(guò)super.someProperty從getter返回值來(lái)傳遞繼承的值肯骇。
覆蓋屬性觀察者
可以使用屬性覆蓋將屬性觀察器添加到繼承的屬性窥浪。這使您可以在繼承的屬性的值更改時(shí)得到通知祖很,而無(wú)論該屬性最初是如何實(shí)現(xiàn)的。
不能將屬性觀察器添加到繼承的常量存儲(chǔ)屬性或繼承的只讀計(jì)算屬性漾脂。這些屬性的值無(wú)法設(shè)置假颇,因此不建議在替代中提供willSet或didSet實(shí)現(xiàn)。
還要注意骨稿,您不能同時(shí)為同一屬性提供覆蓋設(shè)置器和覆蓋屬性觀察器笨鸡。如果您要觀察屬性值的變化,并且已經(jīng)在為該屬性提供自定義設(shè)置器坦冠,則可以簡(jiǎn)單地觀察自定義設(shè)置器中的任何值更改形耗。
防止被覆蓋
您可以通過(guò)將方法,屬性或下標(biāo)標(biāo)記為final來(lái)防止其被覆蓋辙浑。final?varfinal?funcfinal?class?funcfinal?subscript
嘗試覆蓋子類中的最終方法激涤,屬性或下標(biāo)的任何嘗試都將報(bào)告為編譯時(shí)錯(cuò)誤。您添加到擴(kuò)展中的類的方法判呕,屬性或下標(biāo)也可以在擴(kuò)展的定義中標(biāo)記為final倦踢。您可以通過(guò)在類定義()中final的class關(guān)鍵字之前編寫修飾符來(lái)將整個(gè)類標(biāo)記為最終類。任何試圖將最終類作為子類的嘗試都將報(bào)告為編譯時(shí)錯(cuò)誤侠草。final?class