iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
Mobile Development

Swift30天:從語法到觀念,告訴你在踏入實作前最好弄清楚的那些事系列 第 9

# Day9--老爸,我可以繼承你的家產,但我不想長得太像你

  • 分享至 

  • xImage
  •  

引述自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.覆寫方法

1.覆寫屬性(override property)

在覆寫屬性的時候,大概會有幾件事情:第一件是宣稱你要覆寫的屬性是在父類別裡面的某一個屬性,第二件是:

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

如果以上述的圖片中,擷取getter與setter的部分:
覆寫name的字串:

覆寫power的Double:

如此,基於上兩者的描述,可以知道,get在做的事情就是能夠返回值,而set則將newValue的部分指向新覆寫的值,無論是String或Double。

2.覆寫方法(override method)

在執行覆寫的時候,有一個關鍵字一定要加上去,它叫做override,它覆寫在函式上的時候就會像下面這個樣子:
原本的Fighter:

David的attack( )覆寫掉Fighter的attack( ):

總之,覆寫這個功能的主要用途,就是把父類別不一樣的地方直接修改成我們要的項目。

綜合本篇對繼承(inherit)的這個概念的描述,大概可以分成以下幾件事情:

兒子當然會繼承父親的一些東西吧?
但兒子仍舊會有一些想要跟父親不一樣的地方吧?
所以覆寫就是讓兒子跟父親不一樣的功能囉!

tags: 鐵人賽

上一篇
# Day8--物件兄弟黨的小弟們:屬性與方法
下一篇
# Day10--只有藍圖是不夠的!我們要來變出一個實體!
系列文
Swift30天:從語法到觀念,告訴你在踏入實作前最好弄清楚的那些事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言