引述自100Days of Swift-Class inheritance:
The second difference between classes and structs is that you can create a class based on an existing class — it inherits all the properties and methods of the original class, and can add its own on top.
第二件類別與結構不相同的地方,即於類別(class)可以創造另一個類別,且基於你現在創造的類別的上一個類別,基於上一個類別再創造的類別,它可以繼承所有在上一個類別裡的屬性與方法,且,可以增加自己的在它自己的上面。
This is called class inheritance or subclassing, the class you inherit from is called the “parent” or “super” class, and the new class is called the “child” class.
這個被稱作是繼承(inheritance)或是子類化(subclassing),你繼承自(inherit from)的類別,可以稱作是父類別(parant),或俗一點的翻譯:超類別,而你現在新創造的這個類別則稱為子類別(child class)
簡言之,你從一個人身上生下來,你勢必會有他身上的特徵,但你又跟他不一樣,但因爲你的人生是你的,所以你會有一些不一樣的特別之處在你身上。
如果以實務上來說,大家應該玩過小朋友齊打交(LF2),我猜想它應該就是爲所有人物先創造一個基本型態(透明人),然後其他的角色就是繼承透明人的基本輪廓,延伸出各樣擁有自己能力的邪鬼….冰火人….等。
那既然上面都舉了個LF2的例子了,以下就會盡量以基於LF2的概念下去延伸這個篇章,而就以實例來說,我們就先定義了Fighter這個基本類別:
如何產出子類別,會以下面這個概念來描述:
而實際產出子類別的實例,我們則以某個角色David作為設定好了:
如果我們不做覆寫的改動它的方法以及屬性,它仍舊會繼承父類別Fighter的屬性,比如像name就還是保有它最初的“No one”字串,power、speed則是維持原先父類別的100。
不過,當然我們在做一個角色的時候,還是要把它的父類別蓋過去吧?
所以,我們接下來要談的就會是覆寫(override)這個功能。
覆寫為主的功能
下面這些會講到一個概念是覆寫,無論是1.覆寫屬性或是2.覆寫方法
在覆寫屬性的時候,大概會有幾件事情:第一件是宣稱你要覆寫的屬性是在父類別裡面的某一個屬性,第二件是:
需要使用getter(以及有時可省略的setter)來覆寫繼承來的屬性,且一定要寫上屬性的名稱及型別,這樣才能確定是從哪一個屬性繼承而來的。
如果以上述的圖片中,擷取getter與setter的部分:
覆寫name的字串:
覆寫power的Double:
如此,基於上兩者的描述,可以知道,get在做的事情就是能夠返回值,而set則將newValue的部分指向新覆寫的值,無論是String或Double。
在執行覆寫的時候,有一個關鍵字一定要加上去,它叫做override,它覆寫在函式上的時候就會像下面這個樣子:
原本的Fighter:
David的attack( )覆寫掉Fighter的attack( ):
總之,覆寫這個功能的主要用途,就是把父類別不一樣的地方直接修改成我們要的項目。
綜合本篇對繼承(inherit)的這個概念的描述,大概可以分成以下幾件事情:
兒子當然會繼承父親的一些東西吧?
但兒子仍舊會有一些想要跟父親不一樣的地方吧?
所以覆寫就是讓兒子跟父親不一樣的功能囉!
鐵人賽