1.2 面向對象的開發 (OOP: Object Oriented Programming)
1.2.1 面向對象程序設計模式
發明面向對象程序設計方法的主要出發點是彌補面向過程程序設計方法中的一些缺點。OOP把數據看作程序開發中的基本元素,并且不允許它們在系統中自由流動。它將數據和操作這些數據的函數緊密的連結在一起,并保護數據不會被外界的函數意外的改變。OOP允許我們將問題分解為一系列實體——這些實體被稱為對象(object),然后圍繞這些實體建立數據和函數。面向對象程序設計中的數據和函數的組織結構如圖所示。
?
1.2.2 什么是面向對象程序設計?
? ? ? ?面向對象程序設計(OOP)技術汲取了結構化程序設計中好的思想,并將這些思想與一些新的、強大的理念相結合,從而給你的程序設計工作提供了一種全新的方法。通常,在面向對象的程序設計風格中,你會將一個問題分解為一些相互關聯的子集,每個子集內部都包含了相關的數據和函數。同時,你會以某種方式將這些子集分為不同等級,而一個對象就是已定義的某個類型的變量。當你定義了一個對象,你就隱含的創建了一個新的數據類型。 1.2.3 面向對象程序設計中的基本概念 “面向對象”作為一個術語,在不同的人群中有著不同的解釋。因此,了解一些在面向對象程序設計中廣泛應用的概念是必須的。本節我們討論以下這些內容:
1、對象(Object)
2、類(Class)
?3、數據抽象(Data abstraction)
4、繼承(Inheritance)
5、動態綁定(Dynamic binding)
6、數據封裝(Data encapsulation)
7、多態性(Polymorphism)
8、消息傳遞(Message passing)
對象
在一個面向對象的系統中,對象是運行期的基本實體。它可以用來表示一個人或者說一個銀行帳戶,一張數據表格,或者其它什么需要被程序處理的東西。它也可以用來表示用戶定義的數據,例如一個向量,時間或者列表。在面向對象程序設計中,問題的分析一般以對象及對象間的自然聯系為依據。如前所述,對象在內存中占有一定空間,并且具有一個與之關聯的地址,就像Pascal中的record和C中的結構一樣。 當一個程序運行時,對象之間通過互發消息來相互作用。例如,程序中包含一個“customer”對象和一個“account”對象,而customer對象可能會向account對象發送一個消息,查詢其銀行帳目。每個對象都包含數據以及操作這些數據的代碼。即使不了解彼此的數據和代碼的細節,對象之間依然可以相互作用,所要了解的只是對象能夠接受的消息的類型,以及對象返回的響應的類型,雖然不同的人會以不同的方法實現它們。
類
我們剛才提到,對象包含數據以及操作這些數據的代碼。一個對象所包含的所有數據和代碼可以通過類來構成一個用戶定義的數據類型。事實上,對象就是類類型(class type)的變量。一旦定義了一個類,我們就可以創建這個類的多個對象,每個對象與一組數據相關,而這組數據的類型在類中定義。因此,一個類就是具有相同類型的對象的抽象。例如,芒果、蘋果和桔子都是fruit類的對象。類是用戶定義的數據類型,但在一個程序設計語言中,它和內建的數據類型行為相同。比如創建一個類對象的語法和創建一個整數對象的語法一模一樣。如果fruit被定義為一個
類,那么語句 fruit mango; 就創建了一個fruit類的對象mango。 數據抽象和封裝
把數據和函數包裝在一個單獨的單元(稱為類)的行為稱為封裝。數據封裝是類的最典型特點。數據不能被外界訪問,只能被封裝在同一個類中的函數訪問。這些函數提供了對象數據和程序之間的接口。避免數據被程序直接訪問的概念被稱為“數據隱藏”。 抽象指僅表現核心的特性而不描述背景細節的行為。類使用了抽象的概念,并且被定義為一系列抽象的屬性如尺寸、重量和價格,以及操作這些屬性的函數。類封裝了將要被創建的對象的所有核心屬性。因為類使用了數據抽象的概念,所以它們被稱為抽象數據類型(ADT)。
封裝
封裝機制將數據和代碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許創建對象。簡單的說,一個對象就是一個封裝了數據和操作這些數據的代碼的邏輯實體。 在一個對象內部,某些代碼和(或)某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程序中無關的部分意外的改變或錯誤的使用了對象的私有部分。
繼承
繼承是可以讓某個類型的對象獲得另一個類型的對象的屬性的方法。它支持按級分類的概念。例如,知更鳥屬于飛鳥類,也屬于鳥類。就像圖5中描繪的那樣,這種分類的原則是,每一個子類都具有父類的公共特性。
?
在OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說,我們可以向一個已經存在的類中添加新的特性,而不必改變這個類。這可以通過從這個已存在的類派生一個新類來實現。這個新的類將具有原來那個類的特性,以及新的特性。而繼承機制的魅力和強大就在于它允許程序員利用已經存在的類(接近需要,而不是完全符合需要的類),并且可以以某種方式修改這個類,而不會影響其它的東西。 注意,每個子類只定義那些這個類所特有的特性。而如果沒有按級分類,每類都必須顯式的定義它所有的特性。
多態
多態是OOP的另一個重要概念。多態的意思是事物具有不同形式的能力。舉個例子,對于不同的實例,某個操作可能會有不同的行為。這個行為依賴于所要操作數據的類型。比如說加法操作,如果操作的數據是數,它對兩個數求和。如果操作的數據是字符串,則它將連接兩個字符串。 圖6演示了一個函數處理不同數量、不同類型的參數。就像某個單詞在不同的上下文中具有不同的含義
?
多態機制使具有不同內部結構的對象可以共享相同的外部接口。這意味著,雖然針對不同對象的具體操作不同,但通過一個公共的類,它們(那些操作)可以通過相同的方式予以調用。多態在實現繼承的過程中被廣泛應用。 面向對象程序設計語言支持多態,術語稱之為“one interface multiple method(一個接口,多個實現)”。簡單來說,多態機制允許通過相同的接口引發一組相關但不相同的動作,通過這種方式,可以減少代碼的復雜度。在某個特定的情況下應該作出怎樣的動作,這由編譯器決定,而不需要程序員手工干預。 在多函數程序中,許多重要的數據被聲明為全局變量,這樣它們才可以被所有的函數訪問。每個函數又可以具有它自己的局部變量。全局變量很容易被某個函數不經意之間改變。而在一個大程序中,很難分辨每個函數都使用了哪些變量。如果我們需要修改某個外部數據的結構,我們就要修改所有訪問這個數據的函數。這很容易導致bug的產生
在結構化程序設計中,另一個嚴重的缺陷是不能很好的模擬真實世界的問題。這是因為函數都是面向過程的,而不是真正的對應于問題中的各個元素。 面向過程的程序設計的一些特點如下:
?強調做(算法);
?大程序被分隔為許多小程序,這些小程序稱為函數; ?大多數函數共享全局數據;
?數據開放的由一個函數流向另一個函數。函數把數據從一種形式轉換為另一種形式。 采用由上至下的程序設計方法。
動態綁定
綁定指的是將一個過程調用與相應代碼鏈接起來的行為。動態綁定的意思是,與給定的過程調用相關聯的代碼只有在運行期才可知。它與多態和繼承的聯系極為緊密。一個多態引用的函數調用決定于這個引用的動態類型。 考慮圖6中的“draw”方法。通過繼承,每個對象都具備了這個過程。但是,對于不同的對象它的算法是不同的,因此,draw過程必須在每一個類中重新定義。在運行期,當前引用對象所對應的代碼將被調用。
消息傳遞
一個面向對象的程序由許多對象組成,這些對象之間需要相互溝通。因此,在面向對象程序設計語言中,程序設計的主要步驟如下: 1、創建類,這些類定義了對象及其行為; 2、由類定義創建對象; 3、建立對象之間的通訊。 對象之間通過收發信息相互溝通,這一點類似于人與人之間的信息傳遞。信息傳遞的概念使得真實世界的直接模擬更易于和建立系統交流。 對于某個特定對象來說,消息就是請求執行某個過程,因此,消息的接收對象會調用一個函數(過程),以產生預期的結果。傳遞的消息的內容包括接收消息的對象的名字,需要調用的函數的名字,以及必要的信息。 對象就有一個生命周期。它們可以被創建和銷毀。只要對象正處于其生存期,就可以與其進行通訊。
評論
查看更多