1. 程式人生 > >面向對象編程OOP Object oriented programing

面向對象編程OOP Object oriented programing

統架構 tps div mes 很難 多重繼承 類的屬性 inter 復雜

oop是面向對象編程(設計) 面向對象程序設計(英語:Object Oriented Programming,縮寫:OOP),指一種程序設計範型,同時也是一種程序開發的方法論。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性。基本理論

一項由 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的誕生。

面向對象編程OOP Object oriented programing