理論歷史
1967年挪威計算中心的Kisten Nygaard和Ole Johan Dahl開發了Si面向對象程式設計mula67語言,它提供了比子程式更高一級的抽象和封裝,引入了數據抽象和類的概念,它被認為是第一個面向對象語言。
世紀70年代初,Palo Alto研究中心的Alan Kay所在的研究小組開發出Smalltalk語言,之後又開發出Smalltalk-80,Smalltalk-80被認為是最純正的面向對象語言,它對後來出現的面向對象語言,如Object-C,C++,Self,Eiffl都產生了深遠的影響。隨著面向對象語言的出現,面向對象程式設計也就應運而生且得到迅速發展。之後,面向對象不斷向其他階段滲透,1980年Grady Booch提出了面向對象設計的概念,之後面向對象分析開始。1985年,第一個商用面向對象資料庫問世。1990年以來,面向對象分析、測試、度量和管理等研究都得到長足發展。
實際上,“對象”和“對象的屬性”這樣的概念可以追溯到20世紀50年代初,它們首先出現於關於人工智慧的早期著作中。但是出現了面向對象語言之後,面向對象思想才得到了迅速的發展。過去的幾十年中,程式設計語言對抽象機制的支持程度不斷提高:從機器語言到彙編語言,到高級語言,直到面向對象語言。彙編語言出現後,程式設計師就避免了直接使用0-1,而是利用符號來表示機器指令,從而更方便地編寫程式;當程式規模繼續增長的時候,出現了Fortran、C、Pascal等高級語言,這些高級語言使得編寫複雜的程式變得容易,程式設計師們可以更好地對付日益增加的複雜性。但是,如果軟體系統達到一定規模,即使套用結構化程式設計方法,局勢仍將變得不可控制。作為一種降低複雜性的工具,面向對象語言產生了,面向對象程式設計也隨之產生。
基本概念
面向對象程式設計中的概念主要包括:對象、類、數據抽象、繼承、動態綁定、數據封裝、多態性、訊息傳遞。通過這些概念面向對象的思想得到了具體的體現。
1)對象(Object) 可以對其做事情的一些東西。一個對象有狀態、行為和標識三種屬性。
2)類(class) 一個共享相同結構和行為的對象的集合。
3)封裝(encapsulation): 第一層意思:將數據和操作捆綁在一起,創造出一個新的類型的過程。
第二層意思:將接口與實現分離的過程。
4)繼承 類之間的關係,在這種關係中,一個類共享了一個或多個其他類定義的結構和行為。繼承描述了類之間的“是一種”關係。子類可以對基類的行為進行擴展、覆蓋、重定義。
5)組合 既是類之間的關係也是對象之間的關係。在這種關係中一個對象或者類包含了其他的對象和類。
組合描述了“有”關係。
6)多態 類型理論中的一個概念,一個名稱可以表示很多不同類的對象,這些類和一個共同超類有關。因此,這個名稱表示的任何對象可以以不同的方式回響一些共同的操作集合。
7)動態綁定 也稱動態類型,指的是一個對象或者表達式的類型直到運行時才確定。通常由編譯器插入特殊代碼來實現。與之對立的是靜態類型。
8)靜態綁定 也稱靜態類型,指的是一個對象或者表達式的類型在編譯時確定。
9)訊息傳遞 指的是一個對象調用了另一個對象的方法(或者稱為成員函式)。
10)方法 也稱為成員函式,是指對象上的操作,作為類聲明的一部分來定義。方法定義了可以對一個對象執行那些操作。
基本理論
一項由Deborah J. Armstrong進行的長達40年之久的計算機著作調查顯示出了一系列面向對象程式設計的基本理論。它們是:
類(Class)定義了一件事物的抽象特點。通常來說,類定義了事物的屬性和它可以做到的(它的行為)。舉例來說,“狗”這個類會包含狗的一切基礎特徵,例如它的孕育、毛皮顏色和吠叫的能力。類可以為程式提供模版和結構。一個類的方法和屬性被稱為“成員”。
歷史簡介
計算機科學中對象和實例概念的最早萌芽可以追溯到麻省理工學院的PDP-1系統。這一系統大概是最早的基於容量架構(capability based architecture)的實際系統。另外1963年Ivan Sutherland的Sketchpad套用中也蘊含了同樣的思想。對象作為編程實體最早是於1960年代由Simula 67語言引入思維。Simula這一語言是奧利-約翰·達爾和克利斯登·奈加特在挪威奧斯陸計算機中心為模擬環境而設計的。(據說,他們是為了模擬船隻而設計的這種語言,並且對不同船隻間屬性的相互影響感興趣。他們將不同的船隻歸納為不同的類,而每一個對象,基於它的類,可以定義它自己的屬性和行為。)這種辦法是分析式程式的最早概念體現。在分析式程式中,我們將真實世界的對象映射到抽象的對象,叫做“模擬”。Simula不僅引入了“類”的概念,還套用了實例這一思想——這可能是這些概念的最早套用。
20世紀70年代施樂PARC研究所發明的Smalltalk語言將面向對象程式設計的概念定義為,在基礎運算中,對對象和訊息的廣泛套用。Smalltalk的創建者深受Simula 67的主要思想影響,但Smalltalk中的對象是完全動態的——它們可以被創建、修改並銷毀,這與Simula中的靜態對象有所區別。此外,Smalltalk還引入了繼承性的思想,它因此一舉超越了不可創建實例的程式設計模型和不具備繼承性的Simula。
此外,Simula 67的思想亦被套用在許多不同的語言,如Lisp、Pascal。
面向對象程式設計在80年代成為了一種主導思想,這主要應歸功於C++——C語言的擴充版。在圖形用戶界面(GUI)日漸崛起的情況下,面向對象程式設計很好地適應了潮流。GUI和面向對象程式設計的緊密關聯在Mac OS X中可見一斑。Mac OS X是由Objective-C語言寫成的,這一語言是一個仿Smalltalk的C語言擴充版。面向對象程式設計的思想也使事件處理式的程式設計更加廣泛被套用(雖然這一概念並非僅存在於面向對象程式設計)。一種說法是,GUI的引入極大地推動了面向對象程式設計的發展。
蘇黎世聯邦理工學院的尼克勞斯·維爾特和他的同事們對抽象數據和模組化程式設計進行了研究。Modula-2將這些都包括了進去,而Oberon則包括了一種特殊的面向對象方法——不同於Smalltalk與C++。
面向對象的特性也被加入了當時較為流行的語言:Ada、BASIC、Lisp、Fortran、Pascal以及種種。由於這些語言最初並沒有面向對象的設計,故而這種糅合常常會導致兼容性和維護性的問題。與之相反的是,“純正的”面向對象語言卻缺乏一些程式設計師們賴以生存的特性。在這一大環境下,開發新的語言成為了當務之急。作為先行者,Eiffel成功地解決了這些問題,並成為了當時較受歡迎的語言。
在過去的幾年中,Java語言成為了廣為套用的語言,除了它與C和C++語法上的近似性。Java的可移植性是它的成功中不可磨滅的一步,因為這一特性,已吸引了龐大的程式設計師群的投入。
近日,一些既支持面向對象程式設計,又支持面向過程程式設計的語言悄然浮出水面。它們中的佼佼者有Python、Ruby等等.
正如面向過程程式設計使得結構化程式設計的技術得以提升,現代的面向對象程式設計方法使得對設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。