物件導向的程式設計方法繼承了結構化程式設計方法的優點,同時又比較有效地克服了結構化程式設計的弱點。
物件導向的程式設計思路更接近於真實世界。真實世界是由各類不同的事物組成的,每一類事物都有共同的特點,各個事物互相作用構成了多彩的世界。例如,“人”是一類事物,“動物”也是一類事物;人可以飼養動物、獵殺動物;動物有時也攻擊人……
物件導向的程式設計方法要分析待解決的問題中有哪些類事物,每類事物都有哪些特點,不同的事物種類之間是什麼關係,事物之間如何相互作用等,這跟結構化程式設計考慮如何將問題分解成一個個子問題的思路完全不同。
物件導向的程式設計有“抽象”、“封裝”、“繼承”、“多型”四個基本特點。
在物件導向的程式設計方法中,各種事物稱為“物件”。將同一類事物的共同特點概括出來,這個過程就叫作“抽象”。
物件的特點包括兩個方面:屬性和方法。
屬性指的是物件的靜態特徵,如員工的姓名、職位、薪水等,可以用變數表示;
方法指的是物件的行為,以及能對物件進行的操作,如員工可以請假、加班,員工可以被提拔、被加薪等,可以用函數表示。
方法可以對屬性進行操作,如加薪“方法”會修改“薪水”屬性,“提拔”方法會修改“職位”屬性。
在完成抽象後,通過某種語法形式,將資料(即屬性)和用以運算元據的演算法(即方法)捆綁在一起,在形式上寫成一個整體,即“類”,這個過程就叫作“封裝”。
通過封裝,資料和運算元據的演算法緊密聯絡起來。
通過封裝,還可以將物件的一部分屬性和方法隱藏起來,讓這部分屬性和方法對外不可見,而留下另一些屬性和方法對外可見,作為對物件進行操作的介面。這樣就能合理安排資料的可存取範圍,減少程式不同部分之間的耦合度,從而提高程式碼擴充、程式碼修改、程式碼重用的效率。
以現有程式碼為基礎方便地擴充出新的功能和特性,是所有軟體開發者的需求。結構化的程式設計語言對此沒有特殊支援。而物件導向的程式設計語言通過引入“繼承”機制,較好地滿足了開發者的需求。
所謂“繼承”,就是在編寫一個“類”的時候,以現有的類作為基礎,使得新類從現有的類“派生”而來,從而達到程式碼擴充和程式碼重用的目的。
“多型”則是指不同種類的物件都具有名稱相同的行為,而具體行為的實現方式卻有所不同。例如,遊戲中的弓箭手和刀斧手都有名為“攻擊”的方法,但是兩者的實現方式不同,前者是通過射箭實現攻擊,後者則是通過劈砍實現攻擊。
在物件導向的程式設計方法中,沃斯教授的公式需要修改了,應該變成:
類 + 類 + …… + 類 = 物件導向的程式
對於物件導向的程式設計方法來說,設計程式的過程就是設計類的過程。物件導向的程式模式如下圖所示,class 即代表“類”。
圖:物件導向的程式模式