對象
對象從不同的角度有不同的含義,我們針對系統開(kāi)發(fā)來(lái)討論對象的概念,其定義是:
對象(Object)是系統中用來(lái)描述客觀(guān)事物的一個(gè)實(shí)體,它是構成系統的一個(gè)基本單位,由一組屬性和對這組屬性進(jìn)行操作的一組服務(wù)組成。
在這里,屬性和服務(wù)是構成對象的兩個(gè)基本要素,其定義是:
屬性是用來(lái)描述對象靜態(tài)特征的一個(gè)數據項。
服務(wù)是用來(lái)描述對象動(dòng)態(tài)特征(行為)的一個(gè)操作序列。
從一般意義上講,對象是現實(shí)世界中的一個(gè)實(shí)際存在的事物,它可以是有形的,如車(chē)輛、房屋等,也可以是無(wú)形的,如國家、生產(chǎn)計劃等。而人們在開(kāi)發(fā)一個(gè)系統時(shí),則在一定的范圍(也稱(chēng)問(wèn)題域)內考慮和認識與系統目標有關(guān)的事物,并用系統中的對象來(lái)抽象地表示它們。在這里,對象只描述客觀(guān)事物本質(zhì)的、與系統目標有關(guān)的特征,而不考慮那些非本質(zhì)的、與系統目標無(wú)關(guān)的特征。同時(shí),對象是屬性和服務(wù)的結合體,對象的屬性值只能由這個(gè)對象的服務(wù)來(lái)讀取和修改。
類(lèi)
類(lèi)(Class)是具有相同屬性和服務(wù)的一組對象的集合,它為屬于該類(lèi)的全部對象提供了統一的抽象描述,其內部包括屬性和服務(wù)兩個(gè)主要部分。
類(lèi)好比是一個(gè)對象模板,用它可以產(chǎn)生多個(gè)對象。類(lèi)所代表的是一個(gè)抽象的概念或事物,在客觀(guān)世界中實(shí)際存在的是類(lèi)的實(shí)例,即對象。
舉例:在學(xué)校教學(xué)管理系統中,"學(xué)生"是一個(gè)類(lèi),其屬性具有姓名、性別、年齡等,可以定義"入學(xué)注冊"、"選課"等操作。一個(gè)具體的學(xué)生"王平"是一個(gè)對象,也是"學(xué)生"類(lèi)的一個(gè)實(shí)例。
把眾多的事物歸納并劃分成一些類(lèi)是人類(lèi)在認識客觀(guān)世界時(shí)經(jīng)常采用的思維方法,分類(lèi)的原則是抽象,從那些與當前目標有關(guān)的本質(zhì)特征中找出事物的共性,并將具有共同性質(zhì)的事物劃分成一類(lèi),得出一個(gè)抽象的概念。例如:人、房屋、樹(shù)木等都是一些抽象的概念,它們是一些具有共同特征的事物的集合,稱(chēng)為類(lèi)。類(lèi)的概念使我們能對屬于該類(lèi)的全部個(gè)體事物進(jìn)行統一的描述,"樹(shù)具有樹(shù)根、樹(shù)干、樹(shù)枝和樹(shù)葉,它能進(jìn)行光合作用",這個(gè)描述適合所有樹(shù),而不必對每一棵具體的樹(shù)進(jìn)行描述。
封裝
封裝(Encapsulation)是把對象的屬性和服務(wù)結合成一個(gè)獨立的系統單位,并盡可能隱藏對象的內部細節。
封裝是面向對象方法的一個(gè)重要原則,系統中把對象看成是屬性和對象的結合體,使對象能夠集中而完整地描述一個(gè)具體事物。封裝的信息隱蔽作用反映了事物的相對獨立性,當我們從外部觀(guān)察對象時(shí),只需要了解對象所呈現的外部行為(即做什么),而不必關(guān)心它的內部細節(即怎么做)。
舉例:電視機包括外形尺寸、分辨率、電壓、電流等屬性,具有打開(kāi)、關(guān)閉、調諧頻道、轉換頻道、設置圖象等服務(wù),封裝意味著(zhù)將這些屬性和服務(wù)結合成一個(gè)不可分的整體,它對外有一個(gè)顯示屏、插頭和一些按鈕等接口,用戶(hù)通過(guò)這些接口使用電視機,而不關(guān)心其內部的實(shí)現細節。
與封裝密切相關(guān)的概念是可見(jiàn)性,它是指對象的屬性和服務(wù)允許對象外部存取和引用的程度。
在軟件上,封裝要求對象以外的部分不能隨意存取對象的內部數據(屬性),從而有效地避免了外部錯誤對它的"交叉感染",使軟件錯誤能夠局部化,大大減少了查錯和排錯的難度。另外,當對象內部需要修改時(shí),由于它只通過(guò)少量的服務(wù)接口對外提供服務(wù),便大大減少了內部修改對外部的影響,即減少了修改引起的"波動(dòng)效應"。
封裝也有副作用,如果強調嚴格的封裝,則對象的任何屬性都不允許外部直接存取,因此就要增加許多沒(méi)有其他意義、只負責讀或寫(xiě)的服務(wù),從而為編程工作增加了負擔,增加了運行開(kāi)銷(xiāo)。為了避免這一點(diǎn),語(yǔ)言往往采取一種比較靈活的做法,即允許對象有不同程度的可見(jiàn)性。
繼承
繼承(Inheritance)是指子類(lèi)可以自動(dòng)擁有父類(lèi)的全部屬性和服務(wù)。
繼承簡(jiǎn)化了人們對現實(shí)世界的認識和描述,在定義子類(lèi)時(shí)不必重復定義那些已在父類(lèi)中定義過(guò)的屬性和服務(wù),只要說(shuō)明它是某個(gè)父類(lèi)的子類(lèi),并定義自己特有的屬性和服務(wù)即可。
舉例:考慮輪船和客輪兩個(gè)類(lèi),輪船具有噸位、時(shí)速、吃水線(xiàn)等屬性和行駛、停泊等服務(wù),客輪具有輪船的全部屬性和服務(wù),又有自己的特殊屬性(如載客量)和服務(wù)(如供餐),因此客輪是輪船的子類(lèi),輪船是客輪的父類(lèi)。
與父類(lèi)/子類(lèi)等價(jià)的其他術(shù)語(yǔ)有一般類(lèi)/特殊類(lèi)、超類(lèi)/子類(lèi)、基類(lèi)/派生類(lèi)等。
一個(gè)類(lèi)可以是多個(gè)父類(lèi)的子類(lèi),它從多個(gè)父類(lèi)中繼承了屬性與服務(wù),這稱(chēng)為多繼承(Multiple Inheritance)。
舉例:客輪既是一種輪船,又是一種客運工具,它可以繼承輪船和客運工具這兩個(gè)類(lèi)的屬性和服務(wù)。
繼承對于軟件復用是十分有益的,如果將OO方法開(kāi)發(fā)的類(lèi)作為可復用構件,那么在開(kāi)發(fā)新系統時(shí)可以直接復用這個(gè)類(lèi),還可以將其作為父類(lèi),通過(guò)繼承而實(shí)現復用,從而大大擴展了復用的范圍。
消息
消息(Message)是對象發(fā)出的服務(wù)請求,一般包含提供服務(wù)的對象標識、服務(wù)標識、輸入信息和應答信息等信息。
通常,一個(gè)對象向另一個(gè)對象發(fā)出消息請求某項服務(wù),接收消息的對象響應該消息,激發(fā)所要求的服務(wù)操作,并將操作結果返回給請求服務(wù)的對象。
舉例:使用電視機時(shí),用戶(hù)通過(guò)按鈕或遙控器發(fā)出轉換頻道的消息,電視機變換對電視臺的接收信號頻率,并將結果顯示給用戶(hù)。在這里,用戶(hù)發(fā)出的信息包括:接受者--電視機;要求的服務(wù)--轉換頻道;輸入信息--轉換后的頻道序號;應答信息--轉換后頻道的節目。
面向對象技術(shù)的封裝機制使對象各自獨立,各司其職,消息通信則為它們提供了唯一合法的動(dòng)態(tài)聯(lián)系途徑,使它們的行為能夠相互配合,構成一個(gè)有機的運動(dòng)的系統。
結構與連接
任何事物之間都不是互相孤立,而是彼此聯(lián)系的,并因此構成一個(gè)有機的整體。對象之間常見(jiàn)的聯(lián)系包括:
* 分類(lèi)關(guān)系,即一般與特殊結構;
* 組成關(guān)系,即整體與部分結構;
* 對象屬性之間的靜態(tài)聯(lián)系,即實(shí)例連接;
* 對象行為之間的動(dòng)態(tài)聯(lián)系,即消息連接。
(1) 一般與特殊結構
圖4.1 一般與特殊結構
又稱(chēng)分類(lèi)結構(classification structure),它是由一組具有一般與特殊關(guān)系(即繼承關(guān)系)的類(lèi)所組成的結構。其中,由一些單繼承關(guān)系的類(lèi)形成的結構稱(chēng)為層次結構,由一些多繼承關(guān)系的類(lèi)形成的結構稱(chēng)為網(wǎng)格結構,圖4.1顯示了一般與特殊的結構。
(2) 整體與部分結構
又稱(chēng)組裝結構(composition structure),它描述對象之間的組成關(guān)系,即一個(gè)(或一些)對象是另一個(gè)對象的組成或部分。例如,大學(xué)中的系由辦公室、實(shí)驗室、資料室等組成, "辦公室"、"實(shí)驗室"、"資料室" 對象類(lèi)與 "系" 對象類(lèi)之間是部分與整體的關(guān)系。
(3) 實(shí)例連接
實(shí)例連接反映對象之間的靜態(tài)聯(lián)系,它是通過(guò)對象的屬性來(lái)表現對象之間的依賴(lài)關(guān)系。在面向對象的術(shù)語(yǔ)中,對象之間的實(shí)例連接被稱(chēng)為鏈接(Link),而存在實(shí)例連接的對象類(lèi)之間的聯(lián)系稱(chēng)為"關(guān)聯(lián)"(Association)。
例如,"教師"與"學(xué)生"是獨立的兩個(gè)類(lèi),它們之間存在"教學(xué)"聯(lián)系,這種聯(lián)系是通過(guò)類(lèi)中的"教學(xué)課程"、"時(shí)間"、"地點(diǎn)"等屬性建立起來(lái)的。
(4) 消息連接
消息連接描述了對象之間的動(dòng)態(tài)聯(lián)系,即如果一個(gè)對象在執行自己的服務(wù)時(shí),需要通過(guò)消息請求另一個(gè)對象為它完成某個(gè)服務(wù),那么就說(shuō)第一個(gè)對象與第二個(gè)對象之間存在著(zhù)消息連接。消息連接是有向的,從消息發(fā)送者指向消息接收者。
一般與特殊結構、整體與部分結構、實(shí)例連接和消息連接都是面向對象的分析和設計階段必須考慮的重要概念,只有在分析和設計階段認清問(wèn)題域中的這些結構與連接關(guān)系,編程時(shí)才能準確而有效地反映問(wèn)題域。
多態(tài)性
多態(tài)性(Polymorphism)是指在父類(lèi)中定義的屬性或服務(wù)被子類(lèi)繼承后,可以具有不同的數據類(lèi)型或表現出不同的行為。
在體現一般與特殊關(guān)系的一個(gè)類(lèi)層次結構中,不同層次的類(lèi)可以共享一個(gè)操作,但卻有各自不同的實(shí)現。當一個(gè)對象接收到一個(gè)請求時(shí),它根據其所屬的類(lèi),動(dòng)態(tài)地選用在該類(lèi)中定義的操作。
舉例:在父類(lèi)"幾何圖形"中定義了一個(gè)服務(wù)"繪圖",但并不確定執行時(shí)繪制一個(gè)什么圖形。子類(lèi)"橢圓"和"多邊形"都繼承了幾何圖形類(lèi)的繪圖服務(wù),但其功能卻不相同:一個(gè)是畫(huà)橢圓,一個(gè)是畫(huà)多邊形。當系統的其他部分請求繪制一個(gè)幾何圖形時(shí),消息中的服務(wù)都是"繪圖",但橢圓和多邊形接收到該消息時(shí)卻各自執行不同的繪圖算法。
多態(tài)性機制不但為軟件的結構設計提供了靈活性,減少了信息冗余,明顯提高了軟件的可復用性和可擴充性。多態(tài)性的實(shí)現需要OOPL提供相應的支持,與多態(tài)性實(shí)現有關(guān)的語(yǔ)言功能包括:重載(overload)、動(dòng)態(tài)綁定(dynamic binding)、類(lèi)屬(generic)。
主動(dòng)對象
主動(dòng)對象(Active Object)是一組屬性和一組服務(wù)的封裝體,其中至少有一個(gè)服務(wù)不需要接收消息就能主動(dòng)執行(稱(chēng)為主動(dòng)服務(wù))。
主動(dòng)對象的作用是描述問(wèn)題域中具有主動(dòng)行為的事物以及在系統設計時(shí)識別的任務(wù),其主動(dòng)服務(wù)描述相應任務(wù)所應完成的操作。在系統實(shí)現階段,主動(dòng)服務(wù)應該被實(shí)現為一個(gè)能并發(fā)執行的、主動(dòng)的程序單位,如進(jìn)程或線(xiàn)程。
除了具有主動(dòng)服務(wù)外,主動(dòng)對象的其他方面與被動(dòng)對象沒(méi)有什么不同,主動(dòng)對象中也可以有一些在消息的驅動(dòng)下執行的一般任務(wù)。