面向對象技術強調在軟體開發過程中面向客觀世界或問題域中的事物,採用人類在認識客觀世界的過程中普遍運用的思維方法,直觀、自然地描述客觀世界中的有關事物。面向對象技術的基本特徵主要有抽象性、封裝性、繼承性和多態性。
特徵
1.抽象性把眾多的事物進行歸納、分類是人們在認識客觀世界時經常採用的思維方法,“物以類聚,人以群分”就是分類的意思,分類所依據的原則是抽象。抽象(Abstract)就是忽略事物中與當前目標無關的非本質特徵,更充分地注意與當前目標有關的本質特徵。從而找出事物的共性,並把具有共性的事物劃為一類,得到一個抽象的概念。例如,在設計一個學生成績管理系統的過程中,考察學生張華這個對象時,就只關心他的班級、學號、成績等,而忽略他的身高、體重等信息。因此,抽象性是對事物的抽象概括描述,實現了客觀世界向計算機世界的轉化。將客觀事物抽象成對象及類是比較難的過程,也是面向對象方法的第一步。例如,將學生抽象成對象及類的過程如圖1-1所示。
2.封裝性封裝(Encapsulation)就是把對象的屬性和行為結合成一個獨立的單位,並儘可能隱蔽對象的內部細節。圖1-1中的學生類也反映了封裝性。封裝有兩個含義:一是把對象的全部屬性和行為結合在一起,形成一個不可分割的獨立單位。對象的屬性值(除了公有的屬性值)只能由這個對象的行為來讀取和修改;二是儘可能隱蔽對象的內部細節,對外形成一道屏障,與外部的聯繫只能通過外部接口實現。
封裝的信息隱蔽作用反映了事物的相對獨立性,可以只關心它對外所提供的接口,即能做什麼,而不注意其內部細節,即怎么提供這些服務。例如,用陶瓷封裝起來的一塊積體電路晶片,其內部電路是不可見的,而且使用者也不關心它的內部結構,只關心晶片引腳的個數、引腳的電氣參數及引腳提供的功能,利用這些引腳,使用者將各種不同的晶片連線起來,就能組裝成具有一定功能的模組。
封裝的結果使對象以外的部分不能隨意存取對象的內部屬性,從而有效地避免了外部錯誤對它的影響,大大減小了查錯和排錯的難度。另一方面,當對象內部進行修改時,由於它只通過少量的外部接口對外提供服務,因此同樣減小了內部的修改對外部的影響。同時,如果一味地強調封裝,則對象的任何屬性都不允許外部直接存取,要增加許多沒有其他意義,只負責讀或寫的行為。這為編程工作增加了負擔,增加了運行開銷,並且使得程式顯得臃腫。為了避免這一點,在語言的具體實現過程中應使對象有不同程度的可見性,進而與客觀世界的具體情況相符合。
封裝機制將對象的使用者與設計者分開,使用者不必知道對象行為實現的細節,只需要用設計者提供的外部接口讓對象去做。封裝的結果實際上隱蔽了複雜性,並提供了代碼重用性,從而降低了軟體開發的難度。
客觀事物既有共性,也有特性。如果只考慮事物的共性,而不考慮事物的特性,就不能反映出客觀世界中事物之間的層次關係,不能完整地、正確地對客觀世界進行抽象描述。運用抽象的原則就是捨棄對象的特性,提取其共性,從而得到適合一個對象集的類。如果在這個類的基礎上,再考慮抽象過程中各對象被捨棄的那部分特性,則可形成一個新的類,這個類具有前一個類的全部特徵,是前一個類的子集,形成一種層次結構,即繼承結構。
繼承(Inheritance)是一種聯結類與類的層次模型。繼承性是指特殊類的對象擁有其一般類的屬性和行為。繼承意味著“自動地擁有”,即特殊類中不必重新定義已在一般類中定義過的屬性和行為,而它卻自動地、隱含地擁有其一般類的屬性與行為。繼承允許和鼓勵類的重用,提供了一種明確表述共性的方法。一個特殊類既有自己新定義的屬性和行為,又有繼承下來的屬性和行為。儘管繼承下來的屬性和行為是隱式的,但無論在概念上還是在實際效果上,都是這個類的屬性和行為。當這個特殊類又被它更下層的特殊類繼承時,它繼承來的和自己定義的屬性和行為又被下一層的特殊類繼承下去。因此,繼承是傳遞的,體現了大自然中特殊與一般的關係。
在軟體開發過程中,繼承性實現了軟體模組的可重用性、獨立性,縮短了開發周期,提高了軟體開發的效率,同時使軟體易於維護和修改。這是因為要修改或增加某一屬性或行為,只需在相應的類中進行改動,而它派生的所有類都自動地、隱含地作了相應的改動。
由此可見,繼承是對客觀世界的直接反映,通過類的繼承,能夠實現對問題的深入抽象描述,反映出人類認識問題的發展過程。
面向對象設計借鑑了客觀世界的多態性,體現在不同的對象收到相同的訊息時產生多種不同的行為方式。例如,在一般類“幾何圖形”中定義了一個行為“繪圖”,但並不確定執行時到底畫一個什麼圖形。特殊類“橢圓”和“多邊形”都繼承了幾何圖形類的繪圖行為,但其功能卻不同,一個是要畫出一個橢圓,另一個是要畫出一個多邊形。這樣一個繪圖的訊息發出後,橢圓、多邊形等類的對象接收到這個訊息後各自執行不同的繪圖函式。如圖1-3所示,這就是多態性的表現。
具體來說,多態性(Polymorphism)是指類中同一函式名對應多個具有相似功能的不同函式,可以使用相同的調用方式來調用這些具有不同功能的同名函式。
繼承性和多態性的結合,可以生成一系列雖類似但獨一無二的對象。由於繼承性,這些對象共享許多相似的特徵;由於多態性,針對相同的訊息,不同對象可以有獨特的表現方式,實現特性化的設計。
面向對象技術使軟體的開發超越了過程式編程,而進入了簡化應用程式開發的可重用編程世界。不象舊的編程方式,當程式的體積增長時,程式維護和調試並不變得更複雜。對象技術在兩個級別發揮作用:
在數據級別,對象技術可以集成一個機構中的許多不同類型的信息,過去的信息已經不再兼容了。
在程式開發級別,對象技術提供模組化程式構造,這時,程式設計師在現有對象的基礎之上進行開發。對象可以被其他對象再使用,以利用它們的過程,從而消除了當再次需要它們的時候,必須每次都重寫這些代碼。
由於無需改變或分解整個系統,所以再設計或擴展系統是很容易的。實際上,是放棄或修改這些模組,並且增加新的模組以提供增強的功能。
一個對象是一個完整的數據分組,它包括對數據進行處理的功能。在一個面向對象的環境,對象的數目是數不清的。它們可能包括一個資料庫的記錄、一個檔案、一個物理資源、甚至是一個用戶(它是用戶的登錄帳戶)。為了使開發人員使用面向對象編程語言工作,對象是一個自滿足模組,它包含數據、以及數據的結構、和處理數據的功能。
對象可以是下面情況的任何之一:
在一個面向對象作業系統中實現一個進程的代碼,例如驗證安全許可權。
程式設計師和開發人員用於彙編程式的預定義代碼模組。
來自一個應用程式的數據塊,如一個繪圖程式、電子表格或多媒體工具。
在一個資料庫中的對象,例如庫存條目或顧客。
在一個面向對象的資料庫中,對象可以代表跟蹤的商務中的實際實體,例如生產的產品、庫存、顧客和廠商。相應地,在面向對象的作業系統中,對象也是一些實體,如檔案、設備和用戶,或構成一個複合文檔的實體數據塊。在面向對象的環境,首先定義基本的對象,然後圍繞這些對象建造系統。
有許多潛在對象,並且它們可以歸化到定義不同類型對象的層次化類(hierarchical classes)。父類可以對子類傳遞特性。讓我們來考慮一個類“people”,它擁有兩個子類“male”和“female”。這些子類又可以擁有它們自己的子類,如圖O-3所示。每個子類都有從它的父親處繼承來的綜合特徵,以及它們自己的專有特徵。另外,一些繼承來的特徵由於它們對子類不合適,而會被阻擋。
這和計算機如何關聯昵?記住,現在我們在討論存儲許多不同數據類型,和訪問許多不同類型應用程式數據的途徑。通過按這種方式對數據分類,我們可以在一個對象內,直接包括進行抽取、顯示、合併和列印的過程數據。如果需要,對數據進行分類,可以簡化構造過程和改造(revision)過程。例如,一個數據塊對象可能包括一個對這些數據按特定的方式進行排序的過程,它可以被許多不同的使用這個數據的應用程式所激活。
對象類和對象實例
對象類 一個類定義了一組對象。類具有行為(be-havoir),它描述一個對象能夠做什麼以及做的方法(method),它們是可以對這個對象進行操作的程式和過程。
對象實例 一個對象是一個類的一個實例,它代表一個現實物理“事件”,例如在一個財物系統資料庫中的一個顧客或一個庫存部分。類的繼承(class inheritance)是一個重要的概念,它為一個子類繼承它的父類的內置描述提供了途徑。在父類中使用的代碼被向下傳給這個類指定的一個類(子類)。
例如,一個面向對象的資料庫可以有一個稱為“client”的類,這個類有兩個子類,分別稱為“company”和“individual”。首先,創立稱為“client”的對象。它包含一個結構和一些過程,這些過程處理數據和從對象之外獲得信息。然後,company和individual對象作為client的子類進行定義。作為一個子類,它們繼承client對象的結構和特徵,但是這些特徵中的一些可能被禁止,或可以增加一些附加特徵。例如,company子類可以具有一個特定的折算,而individua1子類卻不具有。如果你需要一個關於客戶的列表,你可以請求client對象進行列表。然而,如果你希望知道客戶的賬目平衡,你就需要從每個包含客戶平衡的子類對象獲得信息。
對象包含數據和過程,並且當被請求時提供信息。想像一個包含數據的箱子,它有一些按鈕,你可以按這些按鈕來對數據運行過程。方法是,一些對對象進行操作的過程或程式,它們可以使對象根據對象的內部代碼和結構來以特定的形式進行動作。相似地,可以對對象的不同的類進行操作。有一個概念稱為多態性(poly-morphism)或重載(overloading)。使用多態性,一組通用的方法可以在很大範圍的類上進行操作。然而,具有相同名字和稱呼的方式卻可能誘發不同的事情。例如,在文本數據的“next”導致游標跳到下一個工作,而在電子表格的“next”卻導致游標跳到下一個單元。
對象通過傳送訊息與另一個對象對話。這些訊息在本質上是通過按下對象上的“按鈕”從對象請求過程。在一個網路環境,你可以查看和訊息匯流排相連的對象,如圖O-4所示。訊息傳遞為對象在一個面向對象的分散式計算環境進行通信提供了一條有效途徑。訊息傳遞是一種存儲再轉發方式,就象在電子函件系統中使用的那樣。訊息被從一台計算機傳送到另一台計算機,直到它們抵達目的地。
所有這些都加到軟體中,它們易於維護,並且在連續的基礎之上改進,即無需對整個系統進行重新設計。
對象是可重用的,使得系統增長時,它易於加入系統,這是因為在現有對象中的代碼對創造新的對象是可重用的。
對象系統是可擴展的,開發人員增加模組,而模組重用內置數據結構,無需重編譯作業系統。
易於建造系統,這是因為面向對象對設計系統和實現系統提供了一條很自然的途徑。
對象可以提供了一種通用接口,因而許多不同應用程式能夠訪問數據。
也有許多不利的方面,包括大量增加了前端設計的時間,減低了性能和技術的不成熟。然而,隨著系統的成長和硬體的不斷強大,這些不利可以減退。這些缺陷,在對象系統可以在遍布分布網路上的許多不同類型的系統上向用戶提供數據這一事實面前,也會減少。
Objects in Distributed Environments 分散式環境中的對象
對象技術被認為對實現未來的分散式系統是很有生命力的。這樣,系統的複雜性可以通過實現訊息傳遞服務(如對象請求代管器)的模型而簡化。對象只是簡單地請求服務,並且其他對象提供這些服務。開發人員不需要更多地知道對象將在上面通信的系統情況。事實上,對象技術為局部使用、將來擴展到異構分散式環境、設計套用提供了途徑。
在這一領域的發展包括:
對象管理組織(OMG)的公用對象請求代管器體系結構(CORBA)是一種規範,它的設計是為對象產生和接收請求提供了途徑。
Microsoft的對象連結和嵌入(OLE),為在單一台式系統或一個網路上的應用程式共享數據提供了一條途徑。
IBM的系統對象模型(SOM)和分散式系統對象模型(DSOM)提供了低級對象語言
OpenDoc是一種為共享文本、圖形和多媒體對象,而由Apple、Borland、IBM、Novel1和WordPerfect等公司開發的開發環境。
相關條目:Cario;Common Object Model 公用對象模型;Common Object Request Broker Architecture 公用對象請求代管器體系結構;Compound Documents 複合文檔;Object Broker,DEC DEC的Object Broker;Object Linking and Embedding對象連結和嵌入;Object Management Architecture對象管理體系結構;Object-Oriented Interfaces and Operating Systems面向對象的接口和作業系統;Object Request Broker 對象請求代管器;Workplace OS。
面向對象與面向過程的區別
面向對象技術是一種以對象為基礎,以事件或訊息來驅動對象執行處理的程式設計技術。它以數據為中心而不是以功能為中心來描述系統,數據相對於功能而言具有更強的穩定性。它將數據和對數據的操作封裝在一起,作為一個整體來處理,採用數據抽象和信息隱蔽技術,將這個整體抽象成一種新的數據類型——類,並且考慮不同類之間的聯繫和類的重用性。類的集成度越高,就越適合大型應用程式的開發。另一方面,面向對象程式的控制流程由運行時各種事件的實際發生來觸發,而不再由預定順序來決定,更符合實際。事件驅動程式的執行圍繞訊息的產生與處理,靠訊息循環機制來實現。在實際編程時可以採用搭積木的方式來組織程式,站在“巨人”的肩上實現自己的目標。面向對象程式的設計方法使得程式結構清晰、簡單,提高了代碼的重用性,有效減少了程式的維護量,提高了軟體的開發效率。
在結構上,面向對象程式與面向過程程式有很大不同。面向對象程式由類的定義和類的使用兩部分組成:在主程式中定義各對象並規定他們之間傳替訊息的規律,程式中的一切操作都通過向對象傳送訊息來實現;對象接到訊息後,啟動訊息處理函式完成相應的操作。
面向對象程式設計(Object Oriented Programming,OOP)方法出現之前,程式設計師用面向過程的方法開發程式。面向過程的方法把密切相關、相互依賴的數據和對數據的操作相互分離這種實質上的依賴與形式上的分離使得大型程式不但難以編寫,而且難以調試和修改。