物件導向程式設計
在寫這章投影片的時候我猶豫了很久,這週的內容對於成為一個觀念正確的程式設計師,可以說是相當重要的,但內容卻又生硬了點,於是我決定把物件導向程式設計的五個特色獨立成這一個文件,如果你對於成為食字獸有所恐懼,可以先行跳過本章,並不會因此就看不懂以後的內容,遇到問題再回來重讀仍然是可以的。
我們先來一段程式碼,這裡面會出現少許還未學過的語法,但各個物件的功能大家應該能從我們熟悉的String
、print()
這些程式碼猜測出來。我們也幫大家準備好模擬器裡面寫好的版本:
class 人類 { var 名字:String func 打招呼(對象: String) { print("你好!", 對象) } init(名字:String) { self.名字 = 名字 } }
class 工程師: 人類 { func 使用電腦() { print(self.名字, "打開了電腦,開始寫程式") } }
class 鄉民: 人類 { func 使用電腦() { print(self.名字, "打開了電腦,開始逛批踢踢") } override func 打招呼(對象: String) { print("欸,", 對象) } }
// 實際使用的程式碼 var 妹妹 = 人類.init("凹凹") // 毫無反應,就是個妹妹 var 教主 = 工程師.init("教主") // 教主是個工程師 var 天道 = 鄉民.init("天道") // 天道是個鄉民
在上面的程式碼中,我們設計了人類
、工程師
和鄉民
三種物件類別,此時,我們的程式碼還沒有產生實際的意義,電腦知道了什麼是人類
、工程師
和鄉民
,但想像一下就知道,人類
這個類別既不會有名字,也無法打招呼。
要確實的使用這些物件類別,我們必須得宣告實際的物件,例如範例程式碼中的人類物件妹妹
,她擁有一個名字凹凹
,也可以真的去使用打招呼()
的指令,程式碼進行到這邊才有了實際的意義,這是物件導向程式設計的第一個特色「抽象」,意思是物件類別在被實例化之前,都只是抽象的概念。
現在,你可以繼續加入程式碼,例如先試著讓教主和你打招呼。
教主.打招呼("在這邊輸入你的名字")
在這行程式碼內,你其實並不知道打招呼
這個指令是怎麼編寫而成的,但你在我的介紹之下,確實知道這個指令會有什麼效果。物件導向程式設計隱藏了大部分指令的具體執行步驟,在較龐大的專案中,這減低了程式設計複雜性,並且維護了指令的一致性和安全性,這個特色叫做「封裝」。
其次,教主是個工程師
物件,此類別的物件領地內只有一個自訂指令使用電腦()
,然而你的打招呼()
程式碼卻被正確執行了,這是因為藉由class 工程師:人類
的宣告,電腦將認為所有工程師
物件都是人類
(但所有人類
未必都是工程師
),因此人類
所擁有的屬性名字
和自訂指令打招呼()
,工程師
都能使用,這個特色叫做「繼承」。
教主.使用電腦() 天道.使用電腦()
我們再讓天道和教主都去使用電腦,即使他們都是人類
,卻仍然各自印出了不同的訊息,這是因為使用電腦()
這個行動在鄉民
和工程師
兩種物件裡面擁有不同的設計,這個特色叫做「多型」。