要回答第一個問題前,必須先回答一件事:物件(Object)是什麼?
在Struct、Class的語法篇章中,都共通的使用了一個專有名詞叫做「實體化」,這個名詞代表的意義就是「產生了一個實體(instance)」,這個概念的重要性在於,我們在使用Struct、Class去寫程式的時候,其實就是在寫一個「藍圖」,興許拿工程來比喻:
當我實體化一個東西,就是同等於我把我寫出來的一個設計藍圖化為真正的存在。
於是,我們實體化了一個東西,也就代表了一個物件的產生。同時,也意味著我們將設計藍圖的真正地創造成了一個「存在物」。
實體(instance)在現在我們所說的意義中代表的就是物件(Object)。
封裝的概念就有點像是一個包裝的盒子,我們可以決定這個盒子裡面裝什麼,以及這個盒子的哪個部分是簍空的,可以讓外界藉由它的簍空去拿取它簍空部分中裸露的東西。
就以封裝的概念來說,Class的封裝性,就很明顯的訴說了一件事情:
我們必須透過接口,透過物件所提供的介面(interface),取得物件內部細節。如果沒有透過這個接口,就沒有辦法取得這個物件的細節。
換個比較有趣的說法可以是這樣:我們有一台跑車,但我們不用去理解跑車內的引擎、輪胎、把手、方向盤是怎麼做的,但我們知道這些東西是已經被做好的,我們只需要用我們已知的方法操作它就好(比如踩油門、拉手煞車之類的)。
由於物件的完整概念來自類別,所以繼承概念的描述,也是類別最重要的元素:
承繼我先前在「繼承」的相關篇章所描述的:
「父類別」與「子類別」的關係就像是爸爸與兒子一樣,兒子可以可以繼承爸爸的某些基因,但是他並不全然像爸爸,他仍然有他自己可以添加的特質。
這邊就不多說所謂繼承的概念。
多型的概念,其實也是由繼承的概念向下延伸的,多型其實描述的就是:當一個父親的兩個兒子,而這兩個兒子都擁有父親的一些特質,但同時又不會完全跟父親相同。
比如兩個兒子說話的聲音都不會跟父親一樣。
這樣的概念回到多型中,可以精確的描述成:「就算子類別都繼承同樣的方法,但他們的實際內容都不相同」
Well,沒有物件導向的世界,在iOS開發裡可能會是一個ViewController中,有著散落一地的屬性、方法,它可能沒有任何的系統被歸納,所以讓大家在實際操作的時候,不知道要去哪些地方訪問這些被歸類的功能或概念。
也就是說,物件導向其實建構了一個程式開發的界門綱目科屬種,我們可以很清楚地知道,在這個東西內部可能有哪些東西可以調出來用。也讓開發者在執行開發的時候,不會在巨大的ViewController中大海撈針。
所以,充其量物件導向的概念就是在開發的過程中,所有被創建的邏輯都能被找到、應用,讓開發的過程更加的順利,這也是承繼開頭的三個問題中,最後一個問題的概念。
鐵人賽