考慮到有的同學沒有 iPhone,但學習 Swift 語言大家至少都會有 OS X 操作系統,我們的代碼演示都會在 OS X 下完成,使用 CLI 界面。這樣雖然又顯得古老了,但相信我去掉 GUI 會讓你省心不少——因為那又是另一回事了。
那麼現在,讓我們來和 OOP 問個好
我們來看看,用 OOP 進行開發到底會是個什麼樣子?
考慮到我們現在並沒有很高的開發水平,那麼我們把所有的功能實現走用輸出文字代替,僅僅來演示“開發”這個過程本身。
老闆出現了
“我們這次要做一款手機!”
好吧,我們來開發一個手機:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class CellPhone { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } } |
你看,我們的手機系統有四個方法可以使用?
“我們的二代產品要能夠上網!”
好吧,我們再開發一個手機出來:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class CellPhoneG2 { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } func internet() { print("Hello world!") } } |
“我們的三代產品要有 Wifi !”
好吧,畢竟老闆是給你錢的人,我們再來一次吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class CellPhoneG3 { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } func internet() { print("Hello world!") } func wifi() { print("free wifi~") } } |
“你可以回家了。“
好吧,以上三個手機的代碼無論給誰看了都會揪心——冗餘的部分太多了——我們做了那麼多的無用功!難怪會以和老闆爭吵薪水最終被炒為結局。
這時候只聽天空 Duang 的一聲,OOP 駕到,讓我們來看看面向對像是如何救場的:
抽象父類
我們說手機三代都有開機關機打電話和發短信的功能,那我們就開發一個類,把它們抽像出來:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class CellPhone { func call() { print("Call someone!") } func powerUp () { print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } } |
“你這樣做然並卵!”(老闆你別急)
有了這個基礎,我們從 CellPhone 繼承子類,每一個子類都有父類的全部功能,我們只要再加上額外的功能就好了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class G1:CellPhone { } class G2:CellPhone { func internet() { print("Hello world!") } } class G3:CellPhone { func internet() { print("Hello world!") } func wifi() { print("free wifi~") } } |
看吧?這樣就節省了大量的重複開發時間!
“別高興的太早,我還要開發平板電腦! ”
我們都知道其實平板電腦就是個大號的手機,那麼我們只需要增加平板電腦的功能在手機上就好了,硬件換一下就 ok~
“我可不想讓平板電腦代替了手機的位置,它們能上網但不能打電話和發短信! ”
好吧,我們把打電話和發短信的功能重寫一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class GPad:CellPhone { override func call() { print("Can not Call!") } override func sendMessage() { print("Can not Send!") } func GPadModel() { print("Im not CellPhone!") } } |
好了,現在平板電腦誕生了。
“哼,我要全部的設備都能開機帶聲音! ”(老闆你這是鬥氣啊~~)
不過沒有關係,不要擼起袖子準備大干一場——重構整個系統是不必要的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class CellPhone { func call() { print("Call someone!") } func powerUp () { print("play music~") print("Welcome!") } func powerDown() { print("Goodbye~") } func sendMessage() { print("sent a Message!") } } |
好了,我們只要更改了父類的開機方法,所有子類就都有了這個功能。
總結
好吧,整體來說我們這個栗子不是很恰當,但並不妨礙我們領會 OOP 的內涵不是嗎?通過繼承和重寫等 OOP 的機制,我們可以很快速的基於以前的基礎搭建上層建築。而且有類型的規定,我們也可以很方便的修改以前的代碼而不必影響到後續的代碼。
尤其是在多人合作開發的時候,OOP 更是拯救了程序猿的生命,我們可以更加方便的使用別人已經開發寫好的輪子(庫),可以在某某不在的時候也可以繼續開發。
不過,類和對像到底是什麼呢?繼承究竟是怎麼運行的呢?我們下節課再來了解。
本文由 落格博客 原創撰寫:落格博客 » 我們的實驗環境以及初見 OOP
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/1107.html
通俗易懂