全新的程式架構
現在我們一切就緒,雖然本週的課程牽涉到的大多是抽象上的概念,學習起來可能比較痛苦,但此刻就是把範例程式碼重寫成物件導向風格的最佳時機!不要害怕遇到錯誤,從做中學是成為程式設計高手最有效率的方法。
我們的目標是將整個範例程式碼的struct 角色
改寫成class 角色
,並且新增第一週的最後,我們想要完成的功能左轉
和前進指定步數
,並且將前進指定步數的數值,放在(
和)
內傳達給該指令,下面會逐步的說明如何達成這個目標,希望聰明的你可以只參照第一步(因為第一步還會教一個新的語法),之後就自己動手做,真的遇到無法解決的錯誤,才往下看問題出在哪裡。
第一步我們將struct
移植成class
,並且把所有func
前方的mutating
刪除,mutating
是一個struct
專用的語法,告訴電腦當前的func
將會涉及到自身某個或某些屬性的修改,不使用mutating
是無法改變任何自身屬性的(即使宣告為var
也一樣)。我們的前進()
會修改自身的座標
屬性,右轉()
則會修改面向
屬性,最後的printMove()
則只是用來列印出移動的訊息,沒有涉及任何屬性的修改,因此才沒有加上mutating
。
class 角色 { var 面向:方向 var 座標:點 init (面向: 方向, 座標: 點) { self.面向 = 面向 self.座標 = 座標 } func ... func ... }
接著,會有許多種不同的做法,你可以新增一個繼承角色
的class 機器人
,並且把前進、右轉和列印移動訊息的指令都遷移過去,並且新增左轉、前進數步的指令。
class 機器人: 角色 { func 右轉()... func 前進()... func 左轉() { for _ in 1...3 { self.右轉() } } func 前進數步(步數: Int) { for _ in 1...步數 { self.前進() } } }
也可以保留原先的角色
架構,新增一個繼承角色
的class 聰明的角色
,並且把左轉、前進數步的指令寫在這個新class
中。
class 聰明的角色: 角色 { func 左轉()... func 前進數步(步數: Int)... }
也可以直接把左轉、前進數步的功能直接寫在原本的class 角色
裡面。這三種寫法造成了細微的程式架構差異,在本專案裡面,它們的差別並不是很大,但在複雜的專案裡面,往往在開始時就要決定好那些物件要設計那些指令,那些物件又怎麼繼承那些物件,才會事半功倍。
想想看,為什麼
點
要維持著struct
的型態,不改寫成class
?