物件導向程式設計

物件導向程式設計

物件導向程式程式設計的定義是使用「物件」來做設計,但並非所有的程式語言都直接支援「物件導向程式程式設計」相關技術與結構。對於OOP的準確定義及其本意存在著不少爭論。通常,OOP被理解為一種將程式分解為封裝資料及相關操作的模組而進行的程式設計方式。有別於其它程式設計方式,OOP中的與某資料類型相關的一系列操作都被有機地封裝到該資料類型當中,而非散放於其外,因而OOP中的資料類型不僅有著狀態,還有著相關的行為。

物件導向的構建要素由三個部分組成,實例、類別和元資料,元資料會儲存構建所需要的一切資訊。從關係上看,類別與實例為一對多關係,類別和元資料為一對一關係,實例會指向類別,類別會指向元資料,這種關係最終構成了所有物件導向的基礎類別(object)。

OOP理論,及與之同名的OOP實踐相結合創造出了新的一個程式設計架構;OOP思想被廣泛認為是非常有用的,以致一套新的程式設計範式被創造了出來。(其它的程式設計範式例如函數式程式設計或程序式程式設計專注於程式執行的過程,而邏輯程式設計專注於引發程式碼執行的斷言)。對面向類比系統的語言(如:SIMULA 67)的研究及對高可靠性系統架構(如:高效能作業系統和CPU的架構)的研究最終導致了OOP的誕生。其中由Deborah J. Armstrong進行的長達40年之久的電腦著作調查中,顯示出了一系列物件導向程式設計的基本理論。物件導向程式特徵被條列如下[3][4][5][6]

分享非物件導向程式前身語言

編輯

物件導向程式設計通常共享高階程式語言的低階功能。可用於建構一個程式的基本工具包括:

變數:能儲存一些內建型態的資訊如整數與字元,也有些是資料結構像是字串、串列與雜湊表等包含內建或複合的變數如指標。

程式:也稱為函式、方法或常式,是指輸入資料產生輸出結果,現代語言還包含結構化程式設計結構如程式迴圈與條件。

類與物件

編輯

支援物件導向程式語言通常利用繼承其他類達到代碼重用和可延伸性的特性。而類有兩個主要的概念:

類(Class):定義了一件事物的抽象特點。類的定義包含了數據的形式以及對數據的操作。

物件(Object):是類的實例(Instance)。

其中類別(Class)定義了一件事物的抽象特點。類別的定義包含了資料的形式以及對資料的操作。舉例來說,「犬」這個類別會包含犬的一切基礎特徵,即所有「犬」都共有的特徵或行為,例如它的品種、毛皮顏色和吠叫的能力。類別可以為程式提供模版和結構。一個類別的方法和屬性被稱為「成員」。

我們來看一段虛擬碼:

類別犬

開始

公有成員:

吠():

毛色:

私有成員:

品種:

結束

在這串代碼中,我們聲明了一個類別,這個類別具有一些犬的基本特徵。關於公有成員和私有成員,請參見下面的繼承性的內容。

物件(Object)是類別的實例。物件有時會對應到現實世界中的事物,舉例來說,一個圖形程式可能有圓形、矩形與畫面等物件,一個線上購物系統可能有購物車、顧客與產品等類別[7]。有時物件會表示更抽象的實體,比如一個被開啟的檔案或是一個提供美國慣用量測轉換的服務。每個物件就是一個特定類別的實例(例如,名稱是「李華」的物件可能是類別雇員的一個實例)。程式在物件導向程式設計當中被視為方法,變數被視為成員或屬性。例如,「犬」這個類別列舉犬的特點,從而使這個類別定義了世界上所有的犬。而大黃這個物件則是一條具體的犬,它的屬性也是具體的。犬有毛色,而大黃的毛色是黃色的。因此,大黃就是犬這個類別的一個實例。一個具體物件屬性的值被稱作它的「狀態」。(系統給物件分配主記憶體空間,而不會給類別分配主記憶體空間。這很好理解,類別是抽象的,系統不可能給抽象的東西分配空間,而物件則是具體的。)

假設我們已經在上面定義了犬這個類別,我們就可以用這個類別來定義物件:

定義大黃是犬

大黃.毛色 : 黃

大黃.吠()

我們無法讓犬這個類別去吠,但是我們可以讓物件「大黃」去吠,正如狗可以吠,但沒有具體的狗就無法吠。

類別和物件就好比是「實型」和「1.23」,「實型」是一種資料的類別型,而「1.23」是一個真正的「實數」(即物件)。所有的「實數」都具有「實型」所描訴的特徵,如「實數的大小」,系統則分配主記憶體給「實數」儲存具體的數值。

動態組態與訊息傳遞機制

編輯

定義上動態組態是指方法會隨著實例動態的改變。而訊息傳遞機制(Message Passing)是指一個物件通過接受訊息、處理訊息、傳出訊息或使用其他類別的方法來實作一定功能。如:大黃可以通過吠引起人的注意,從而導致一系列的事發生。

封裝性

編輯

具備封裝性(Encapsulation)的物件導向程式設計隱藏了某一方法的具體執行步驟,取而代之的是通過訊息傳遞機制傳送訊息給它。封裝是通過限制只有特定類別的物件可以存取這一特定類別的成員,而它們通常利用介面實作訊息的傳入傳出。舉個例子,介面能確保幼犬這一特徵只能被賦予犬這一類別。通常來說,成員會依它們的存取權限被分為3種:公有成員、私有成員以及保護成員。有些語言更進一步:Java可以限制同一包內不同類別的存取;C#和VB.NET保留了為類別的成員聚集準備的關鍵字:internal(C#)和Friend(VB.NET);Eiffel語言則可以讓使用者指定哪個類別可以存取所有成員。

因此,舉例來說,「犬」這個類別有「吠()」的方法,這一方法定義了犬具體該通過什麼方法吠。但是,大黃的朋友並不知道它到底是如何吠的。

從實例來看:

/* 一個程序導向的程式會這樣寫: */

定義大黃

大黃.定音(442)

大黃.吸氣()

大黃.吐氣()

/* 而當狗的吠叫被封裝到類別中,任何人都可以簡單地使用: */

定義大黃是犬

大黃.吠()

繼承

編輯

繼承性(Inheritance)是指,在某種情況下,一個類別會有「子類別」。子類別比原本的類別(稱為父類別)要更加具體化。例如,「犬」這個類別可能會有它的子類別「中華田園犬」和「牧羊犬」。在這種情況下,「大黃」可能就是中華田園犬的一個實例。子類別會繼承父類別的屬性(英語:Attribute (computing))和行為,並且也可包含它們自己的。我們假設「犬」這個類別有一個方法(行為)叫做「吠()」和一個屬性叫做「毛色」。它的子類別(前例中的中華田園犬和牧羊犬)會繼承這些成員。這意味著程式設計師只需要將相同的代碼寫一次。

在虛擬碼中我們可以這樣寫:

類別 中華田園犬 : 繼承 犬

開始

# 中華田園犬繼承了犬類別的所有方法

結束

# 建立物件

定義 大黃 是 中華田園犬

# 呼叫方法

大黃.吠()

/*

注釋:注意這裡呼叫的是犬類別的吠()方法。

*/

回到前面的例子,「中華田園犬」這個類別可以繼承「毛色」這個屬性,並指定其為黃色。而「牧羊犬」則可以繼承「吠()」這個方法,並指定它的音調。子類別也可以加入新的成員,例如,「牧羊犬」這個類別可以加入一個方法叫做「放牧()」。設若用「中華田園犬」這個類別定義了一個實例「大黃」,那麼大黃就不會放牧,因為這個方法是屬於牧羊犬的,而非中華田園犬。事實上,我們可以把繼承理解為「是」或「屬於」。大黃「是」中華田園犬,中華田園犬「屬於」犬類別。因此,大黃既得到了中華田園犬的屬性,又繼承了犬的屬性。

我們來看虛擬碼:

類別 牧羊犬 : 繼承 犬

開始

公有成員:

放牧()

結束

類別 中華田園犬 : 繼承 犬

開始

# 中華田園犬類別中沒有放牧()方法

結束

# 建立物件

定義 大黃 是 中華田園犬

# 呼叫方法

大黃.放牧()

/*

注釋:錯誤:放牧()是牧羊犬的成員方法,中華田園犬沒有這個方法。

*/

當一個類別從多個父類別繼承時,我們稱之為「多重繼承」。如一隻狗既是中華田園犬又是牧羊犬。多重繼承並不總是被支援的,因為它很難理解,又很難被好好使用。

多型

編輯

多型(Polymorphism)是指由繼承而產生的相關的不同的類別,其物件對同一訊息會做出不同的回應[8]。例如,狗和雞都有「叫()」這一方法,但是呼叫狗的「叫()」,狗會吠叫;呼叫雞的「叫()」,雞則會啼叫。

我們將它體現在虛擬碼上:

類別 犬

開始

公有成員:

叫()

開始

吠()

結束

結束

類別 雞

開始

公有成員:

叫()

開始

啼()

結束

結束

# 建立物件

定義 大黃 是 犬

定義 紅帽 是 雞

# 呼叫方法

大黃.叫()

紅帽.叫()

這樣,雖然同樣是做出叫這一種行為,但大黃和紅帽具體做出的表現方式將大不相同。多型性的概念可以用在運算子多載上,可以根據需求檢視相關介面。

抽象性

編輯

抽象(Abstraction)是簡化複雜的現實問題的途徑,它可以為具體問題找到最恰當的類別定義,並且可以在最恰當的繼承級別解釋問題。舉例說明,大黃在大多數時候都被當作一條狗,但是如果想要讓它做中華田園犬做的事,你完全可以呼叫中華田園犬的方法。如果狗這個類別還有動物的父類別,那麼你完全可以視大黃為動物。

你可能也喜欢

【集锦】曼朱基奇绝杀 克罗地亚创造历史进决赛_时讯_看看新闻网
2023王者荣耀刘备英雄克制关系表,原来克星是他
破洞牛仔裤,DIY原来这么简单!
365bet官方投注网站

破洞牛仔裤,DIY原来这么简单!

📅 06-30 👀 2848
Canon 佳能 EOS 6D 全画幅单反简单体验及样张欣赏
365bet365娱乐场

Canon 佳能 EOS 6D 全画幅单反简单体验及样张欣赏

📅 07-14 👀 1345
毛瑟Kar98k步枪
365bet官方投注网站

毛瑟Kar98k步枪

📅 07-15 👀 3576
提交申诉后,农村淘宝审核要多久?
365bet官方投注网站

提交申诉后,农村淘宝审核要多久?

📅 07-01 👀 4166
千万彩票被冒领,五年打赢官司至今没拿到钱,律师:考虑刑事追责
截肢手术用什么锯骨头
365bet365娱乐场

截肢手术用什么锯骨头

📅 06-29 👀 688
斗鱼tv鱼丸多少钱 斗鱼一个鱼丸价格介绍【详解】