天天看點

面向過程、基于對象、面向對象

我們可了解“純粹”的面向對象程式設計方法是什麼樣的:  

  (1)   所有東西都是對象。可将對象想象成一種新型變量;它儲存着資料,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的元件,然後在程式中将其表達為一個對象。

  (2)   程式是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。為了向對象送出請求,需向那個對象“發送一條消息”。更具體地講,可将消息想象為一個調用請求,它調用的是從屬于目标對象的一個子例程或函數。  

  (3)   每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可制作出新型對象。是以,盡管對象的概念非常簡單,但在程式中卻可達到任意高的複雜程度。  

  (4)   每個對象都有一種類型。根據文法,每個對象都是某個“類”的一個“執行個體”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能将什麼消息發給它?”。

  (5)   同一類所有對象都能接收相同的消息。這實際是别有含義的一種說法,大家不久便能了解。由于類型為“圓”(Circle)的一個對象也屬于類型為“形狀”(Shape)的一個對象,是以一個圓完全能接收形狀消息。這意味着可讓程式代碼統一指揮“形狀”,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱為對象的“可替換性”,是OOP最重要的概念之一。   

  一些語言設計者認為面向對象的程式設計本身并不足以友善解決所有形式的程式問題,提倡将不同的方法組合成“多形程式設計語言”

面向對象其實是現實世界模型的自然延伸。

現實世界中任何實體都可以看作是對象。

對象之間通過消息互相作用。

如果說傳統的過程式程式設計語言是以過程為中心以算法為驅動的話,面向對象的程式設計語言則是以對象為中心以消息為驅動。

用公式表示:

過程式程式設計語言為:程式=算法+資料;

面向對象程式設計語言為:程式=對象+消息。

關于基于對象的一些說法:

差別的方面:

面向對象,将軟體程式的元素構造成對象,指定對象類型,表示對象屬性,和描述對象方法,定義對象後即可用于建立這種      
類型的對象的具體執行個體并構造其他更複雜的對象類型。      
基于對象的程式設計語言,并不支援所有面向對象的功能,往往基于對象隻提供一部分面向對象的功能,有時加入自己的新功能。      
例:java是面向對象的程式設計語言,JAVASCRIPT是基于對象的程式設計語言(腳本語言),javascript并不支援所有      
java面向對象的功能,緻使支援其中一部分!      
例:VB6.0是基于對象的,隻支援封裝,不具有繼承性、多态性。      
有關聯的方面:      
按照傳統的思想,面向對象和基于對象之間的界限可以說是既清楚又模糊。說它清楚,是因為面向對象語言必須從文法上直      
接支援繼承和動态綁定,也就是虛函數機制。說它模糊,是因為基于對象的語言可以在沒有文法直接支援的情況下,達成與      
面向對象語言相同的效果。      
舉個例子,在很多用C語言寫成的作業系統裡,“File”這個概念,既可以代表磁盤檔案,也可以代表串行口,還可以代表各種各樣的裝置,這不是多态性是什麼?有一個概念大家必須改變,就大部分目前項目而言,C語言已經是一種基于對象甚至面向對象的語言,      
而不是單純的“面向過程”語言,例如在Win32 API程式設計中,實際上我們就是在按照面向對象的模式撰寫程式。另外,最經典的基于對象語言是Ada83。按照我現在的體會,面向對象這個概念,更多的是說一種環境和一種設計思維方式。要談這個問題,實在需要不少篇幅,      
這裡就不多說了。      
Object-oriented支援Polymorphism,而Object-based不支援Polymorphism.主要的差別就在于此。      
支援多态的代價是額外的間接性--不論是在“記憶體的獲得”或是在“類型的決斷”上。C++通過class的pointers和references來支援多态,這種程式設計風格就叫面向對象。C++也支援具體的ADT程式風格,被稱為基于對象,它隻支援封裝,不支援類型的擴充。一個Object-based設計可能比一個對等的Object-oriented設計速度更快而且空間更緊湊。      
速度快是因為所有的函數引發操作都在編譯時期解析完成,不需要設定virtual機制;      
空間緊湊則是因為每一個class object不需要負擔傳統上為了支援virtual機制而需要的額外負擔。      

繼續閱讀