object oriented program
物件導向程式設計維基百科,自由的百科全書(重定向自面向对象编程)
跳轉到: 導覽、 搜尋 本條目僅具有一部分地區的信息或觀點,無法做到普世通用和完
整表達包含廣泛區域的信息及觀點。
請協助補充內容以避免偏頗,或討論本文的問題。
編程範式
面向代理
基於元件
基於流
管道
連續式
並行計算
宣告式(對比:命令式)
函數式
資料流
面向細胞(電子試算表)
無功
面向圖形
標的導向
約束
邏輯
回答集編程
約束邏輯
溯因邏輯
歸納邏輯
事件驅動
面向服務
時間驅動
功能導向
函式級(對比:價值級)
命令式(對比:宣告式)
非結構化
陣列(對比:純量)
迭代式
結構化
程序式
模組化
遞迴式
物件導向
基於類別
基於原型
自動機
根據關注分離:
面向方面
面向主題
面向角色
超編程
面向屬性
自動
泛型
模板
基於原則
面向語言
領域特定
面向語法
方言化
意圖
反射式
不確定
並列計算
程序導向
大規模編程與小規模編程
價值級(對比:函式級)
--------------------------------------------------------------------------------
本模板: 檢視 · 討論 · 編輯
物件導向程式設計(英語:Object-oriented programming,縮寫:OOP),指一種程式設
計典範,同時也是一種程式開發的方法。它將物件作為程式的基本單元,將程式和資料封
裝其中,以提高軟體的重用性、靈活性和擴充功能性。[1]
當我們提到物件導向的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發
方式。在這一方面,我們必須了解更多關於物件導向系統分析和物件導向設計(Object
Oriented Design,簡稱OOD)方面的知識。
目錄 [隱藏]
1 概述
2 基本理論
2.1 類別
2.2 物件
2.3 方法(秩序;條例)
2.4 訊息傳遞機制
2.5 繼承性
2.6 封裝性
2.7 多型
2.8 抽象性
3 OOP名詞釋意
4 物件導向的語言
5 歷史
5.1 腳本中的OOP
6 參考文獻
7 相關內容
8 外部連結
[編輯] 概述物件導向程式設計的雛形,早在1960年的Simula語言中即可發現,當時的程
式設計領域正面臨著一種危機:在軟硬體環境逐漸複雜的情況下,軟體如何得到良好的維
護?物件導向程式設計在某種程度上透過強調可重複性解決了這一問題。20世紀70年代的
Smalltalk語言在物件導向方面堪稱經典——以至於30年後的今天依然將這一語言視為物
件導向語言的基礎。
物件導向程式設計可以被視作一種在程式中包含各種獨立而又互相呼叫的單位和物件的思
想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列函式的集合,或者
直接就是一系列對電腦下達的指令。物件導向程式設計中的每一個物件都應該能夠接受資
料、處理資料並將資料傳達給其它物件,因此它們都可以被看作一個小型的「機器」,或
者說是負有責任的角色。
目前已經被證實的是,物件導向程式設計推廣了程式的靈活性和可維護性,並且在大型項
目設計中廣為應用。 此外,支持者聲稱物件導向程式設計要比以往的做法更加便於學習
,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反
對者在某些領域對此予以否認。
[編輯] 基本理論一項由 Deborah J. Armstrong 進行的長達40年之久的電腦著作調查顯
示出了一系列物件導向程式設計的基本理論。它們是:
[編輯] 類別類別(Class)定義了一件事物的抽象特點。通常來說,類別定義了事物的屬
性和它可以做到的(它的行為)。舉例來說,「狗」這個類別會包含狗的一切基礎特徵,
例如它的孕育、毛皮顏色和吠叫的能力。類別可以為程式提供模版和結構。一個類別的方
法和屬性被稱為「成員」。 我們來看一段虛擬碼:
類別 狗
開始
私有成員:
孕育:
毛皮顏色:
公有成員:
吠叫():
結束
在這串代碼中,我們宣告了一個類別,這個類別具有一些狗的基本特徵。關於公有成員和
私有成員,請參見下面的繼承性一節。
[編輯] 物件物件(Object)是類別的例項。例如,「狗」這個類別列舉狗的特點,從而
使這個類別定義了世界上所有的狗。而萊絲這個物件則是一條具體的狗,它的屬性也是具
體的。狗有皮毛顏色,而萊絲的皮毛顏色是棕白色的。因此,萊絲就是狗這個類別的一個
例項。一個具體物件屬性的值被稱作它的「狀態」。(系統給物件分配記憶體空間,而不
會給類別分配記憶體空間,這很好理解,類別是抽象的系統不可能給抽象的東西分配空間
,物件是具體的)
假設我們已經在上面定義了狗這個類別,我們就可以用這個類別來定義物件:
定義萊絲是狗
萊絲.毛皮顏色:=棕白色
萊絲.吠叫()
我們無法讓狗這個類別去吠叫,但是我們可以讓物件「萊絲」去吠叫,正如狗可以吠叫,
但沒有具體的狗就無法吠叫。
[編輯] 方法(秩序;條例)方法(Method)是定義一個類別可以做的,但不一定會去做
的事。作為一條狗,萊絲是會叫的,因此「吠叫()」就是它的一個方法。與此同時,它可
能還會有其它方法,例如「坐下()」,或者「吃()」。 對一個具體物件的方法進行呼叫
並不影響其它物件,正如所有的狗都會叫,但是你讓一條狗叫不代表所有的狗都叫。 如
下例:
定義萊絲是狗
定義泰爾是狗
萊絲.吠叫()
則泰爾是會叫——但沒有吠叫,因為這裡的吠叫只是對物件「萊絲」進行的。
[編輯] 訊息傳遞機制一個物件透過接受訊息、處理訊息、傳出訊息或使用其他類別的方
法來實作一定功能,這叫做訊息傳遞機制(Message Passing)。
[編輯] 繼承性繼承性(Inheritance)是指,在某種情況下,一個類別會有「子類別」。
子類別比原本的類別(稱為父類別)要更加具體化,例如,「狗」這個類別可能會有它的
子類別「牧羊犬」和「吉娃娃犬」。在這種情況下,「萊絲」可能就是牧羊犬的一個例項
。子類別會繼承父類別的屬性和行為,並且也可包含它們自己的。我們假設「狗」這個類
別有一個方法叫做「吠叫()」和一個屬性叫做「毛皮顏色」。它的子類別(前例中的牧羊
犬和吉娃娃犬)會繼承這些成員。這意味著程式設計師只需要將相同的代碼寫一次。 在
虛擬碼中我們可以這樣寫:
類別牧羊犬:繼承狗
定義萊絲是牧羊犬
萊絲.吠叫() /* 注意這裡呼叫的是狗這個類別的吠叫方法。 */
回到前面的例子,「牧羊犬」這個類別可以繼承「毛皮顏色」這個屬性,並指定其為棕白
色。而「吉娃娃犬」則可以繼承「吠叫()」這個方法,並指定它的音調高於平常。子類別
也可以加入新的成員,例如,「吉娃娃犬」這個類別可以加入一個方法叫做「顫抖()」。
設若用「牧羊犬」這個類別定義了一個例項「萊絲」,那麼萊絲就不會顫抖,因為這個方
法是屬於吉娃娃犬的,而非牧羊犬。事實上,我們可以把繼承理解為「是」。例如,萊絲
「是」牧羊犬,牧羊犬「是」狗。因此,萊絲既得到了牧羊犬的屬性,又繼承了狗的屬性
。 我們來看虛擬碼:
類別吉娃娃犬:繼承狗
開始
公有成員:
顫抖()
結束
類別牧羊犬:繼承狗
定義萊絲是牧羊犬
萊絲.顫抖() /* 錯誤:顫抖是吉娃娃犬的成員方法。 */
當一個類別從多個父類別繼承時,我們稱之為「多重繼承」。多重繼承並不總是被支援的
,因為它很難理解,又很難被好好使用。
[編輯] 封裝性具備封裝性(Encapsulation)的物件導向程式設計隱藏了某一方法的具體
執行步驟,取而代之的是透過訊息傳遞機制傳送訊息給它。因此,舉例來說,「狗」這個
類別有「吠叫()」的方法,這一方法定義了狗具體該透過什麼方法吠叫。但是,萊絲的朋
友蒂米並不需要知道它到底如何吠叫。 從例項來看:
/* 一個程序導向的程式會這樣寫: */
定義萊絲
萊絲.設定音調(5)
萊絲.吸氣()
萊絲.吐氣()
/* 而當狗的吠叫被封裝到類別中,任何人都可以簡單地使用: */
定義萊絲是狗
萊絲.吠叫()
封裝是透過限制只有特定類別的例項可以存取這一特定類別的成員,而它們通常利用介面
實作訊息的傳入傳出。舉個例子,介面能確保幼犬這一特徵只能被賦予狗這一類別。通常
來說,成員會依它們的存取許可權被分為3種:公有成員、私有成員以及保護成員。有些
語言更進一步:Java可以限制同一包內不同類別的存取;C#和VB.NET保留了為類別的成員
聚集準備的關鍵字:internal(C#)和Friend(VB.NET);Eiffel語言則可以讓使用者指
定哪個類別可以存取所有成員。
[編輯] 多型多型(Polymorphism)是指由繼承而產生的相關的不同的類別,其物件對同
一訊息會做出不同的響應。[2]舉例來說,狗和雞都有「叫()」這一方法,但是呼叫狗的
「叫()」,狗會吠叫;呼叫雞的「叫()」,雞則會啼叫。 我們將它體現在虛擬碼上:
類別狗
開始
公有成員:
叫()
開始
吠叫()
結束
結束
類別雞
開始
公有成員:
叫()
開始
啼叫()
結束
結束
定義萊絲是狗
定義魯斯特是雞
萊絲.叫()
魯斯特.叫()
這樣,同樣是叫,萊絲和魯斯特做出的反應將大不相同。多型性的概念可以用在運算子過
載上,本文不再贅述。
[編輯] 抽象性抽象(Abstraction)是簡化複雜的現實問題的途徑,它可以為具體問題找到
最恰當的類別定義,並且可以在最恰當的繼承級別解釋問題。舉例說明,萊絲在大多數時
候都被當作一條狗,但是如果想要讓它做牧羊犬做的事,你完全可以呼叫牧羊犬的方法。
如果狗這個類別還有動物的父類別,那麼你完全可以視萊絲為一個動物。
[編輯] OOP名詞釋意編程典範 對於OOP的準確定義及其本意存在著不少爭論。
通常,OOP被理解為一種將程式分解為封裝資料及相關操作的模組而進行的編程方式。有
別於其它編程方式,OOP中的與某資料型別相關的一系列操作都被有機地封裝到該資料型
別當中,而非散放於其外,因而OOP中的資料型別不僅有著狀態,還有著相關的行為。OOP
理論,及與之同名的OOP實踐相結合創造出了新的一個編程架構;OOP思想被廣泛認為是非
常有用的,以致一套新的編程典範被創造了出來。(其它的編程典範例如函數語言程式設
計或程序式編程專註於程式執行的過程,而邏輯編程專註於引發程式代碼執行的斷言)
對面向類比系統的語言(如:SIMULA 67)的研究及對高可靠性系統架構(如:高效能作
業系統和CPU的架構)的研究最終導致了OOP的誕生。
[編輯] 物件導向的語言支援部分或絕大部分物件導向特性的語言即可稱為基於物件的或
物件導向的語言。
早期,完全物件導向的語言主要包括Smalltalk等語言,目前較為流行的語言中有Java、
C#、Eiffel等。隨著軟體工業的發展,比較早的程序導向的語言在近些年的發展中也紛紛
吸收了許多物件導向的概念,比如C->C++,C->Objective-C,BASIC->Visual
Basic->Visual Basic .NET,Pascal->Object Pascal,Ada->Ada95。
[編輯] 歷史電腦科學中物件和例項概念的最早萌芽可以追溯到麻省理工學院的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)技術也得到了一定提升。
[編輯] 腳本中的OOP近年來,物件導向的程式設計越來越流行於指令碼語言中。Python和
Ruby是建立在OOP原理的指令碼語言,Perl和PHP亦分別在Perl 5和PHP 4時加入物件導向
特性。
--
plurk
http://www.plurk.com/dasea2017
face book
0911457604,0934169099
google+
https://plus.google.com/u/0/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.58.22.74
※ 編輯: dasea2008 (210.66.169.48 臺灣), 04/26/2021 05:31:52
※ 編輯: dasea2008 (101.0.228.86 臺灣), 04/11/2022 23:30:19