下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1.面向?qū)ο蟮母拍蠲嫦驅(qū)ο螅∣bject-Oriented)=對象(Object)+類(Class)+繼承(Inheritance)+通信(Communication)如果一個軟件系統(tǒng)是使用這樣4個概念設(shè)計和實現(xiàn)的,則將該軟件系統(tǒng)稱為面向?qū)ο蟮?。下面給出每個概念的具體定義。1.1對象從一般意義上講,對象是現(xiàn)實世界中一個實際存在事物,它可以是有形的(比如一輛汽車),也可以是無形(比如一項計劃)。對象構(gòu)成世界的一個獨立單位,它具有自己的靜態(tài)特征和動態(tài)特征。靜態(tài)特征即可用某種數(shù)據(jù)來描述的特征,動態(tài)特征即對象所表現(xiàn)的行為或?qū)ο笏哂械墓δ堋,F(xiàn)實世界中的任何事物都可以稱作對象,它是大量的、無處不在的。不過,人們在開發(fā)一個系統(tǒng)時,通常只是在一定的范圍(問題域)內(nèi)考慮和認識與系統(tǒng)目標(biāo)有關(guān)的事物,并用系統(tǒng)中的對象抽象地表示它們。所以面向?qū)ο蠓椒ㄔ谔岬健皩ο蟆边@個術(shù)語時,既可能泛指現(xiàn)實世界中的某些事物,也可能專指它們在系統(tǒng)中的抽象表示,即系統(tǒng)中的對象。我們主要對后一種情況討論對象的概念,其定義是:對象是系統(tǒng)中用來描述客觀事物的一個實體,它是構(gòu)成系統(tǒng)的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務(wù)構(gòu)成。屬性和服務(wù),是構(gòu)成對象的兩個主要因素,其定義是:屬性是用來描述對象靜態(tài)特征的一個數(shù)據(jù)項。服務(wù)是用來描述對象動態(tài)特征(行為)的一個操作序列。一個對象可以有多項屬性和多項服務(wù)。一個對象的屬性和服務(wù)被結(jié)合成一個整體,對象的屬性值只能由這個對象的服務(wù)存取。在有些文獻中把對象標(biāo)識(OID)列為對象的另一要素。對象標(biāo)識也就是對象的名字,有“外部標(biāo)識”和“內(nèi)部標(biāo)識”之分。前者供對象的定義者或使用者用,后者為系統(tǒng)內(nèi)部惟一的識別對象。(怎么感覺這點跟android開發(fā)里面的id是一樣的,在某個文件下有編程人員定義的所有屬性的id,并且是唯一的,一般不允許更改,屬于系統(tǒng)內(nèi)部分配。)另外需要說明以下兩點:第一點是,對象只描述客觀事物本質(zhì)的與系統(tǒng)目標(biāo)有關(guān)的特征,而不考慮那些非本質(zhì)的與系統(tǒng)目標(biāo)無關(guān)的特征。這就是說,對象是對事物的抽象描述。第二點是,對象是屬性和服務(wù)的結(jié)合體。二者是不可分的。而且對象的屬性值只能由這個對象的服務(wù)來讀取和修改,這就是后文將講述的封裝概念。根據(jù)以上兩點,也可以給出如下對象定義:對象是問題域或?qū)崿F(xiàn)域中某些事物的一個抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用,它是一組屬性和有權(quán)對這些屬性進行操作的一組服務(wù)的封裝體。系統(tǒng)中的一個對象,在軟件生命周期的各個階段可能有不同的表示形式。例如,在分析與設(shè)計階段是用某種OOD/OOA方法所提供的表示法給出比較粗略的定義,而在編程階段則要用一種OOPL寫出詳細而確切的源程序代碼。這就是說,系統(tǒng)中的對象要經(jīng)歷若干演化階段,其表現(xiàn)形式各異,但在概念上是一致的,即都是問題域中某一事物的抽象表示。1.2類把眾多的事物歸納劃分成一些類是人類在認識客觀世界時經(jīng)常采用的思維方法。分類所依據(jù)的原則是抽象,即:忽略事物的非本質(zhì)特征,只注意那些與當(dāng)前目標(biāo)有關(guān)的本質(zhì)特征,從而找出事物的共性,把具有共同性質(zhì)的事物劃分為一類,得出一個抽象的概念。例如:馬、樹木、石頭等等都是一些抽象概念,它們是一些具有共同特征的事物的集合,被稱作類。類的概念使我們能對屬于該類的全部個體事物進行統(tǒng)一的描述。例如:“樹具有樹根、樹干、樹枝和樹葉,它能進行光合作用”,這個描述適合所有的樹,從而不必對每棵具體的樹進行一次這樣的描述。在OO方法中,類的定義是:類是具有相同屬性和服務(wù)的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個主要部分。在面向?qū)ο蟮木幊陶Z言中,類是一個獨立的程序單位,它應(yīng)該有一個類名并包括屬性說明和服務(wù)說明兩個主要部分。類的作用是定義對象。比如,程序中給出一個類的說明,然后以靜態(tài)聲明或動態(tài)創(chuàng)建等方式定義它的對象實例。類與對象的關(guān)系如同一個模具與用這個模具鑄造出來的鑄件之間的關(guān)系。類給出了屬于該類的全部對象的抽象定義,而對象則是符合這種定義的一個實體。所以,一個對象又稱作類的一個實例(instance),而有的文獻又把類稱作對象的模板(template)。所謂“實體”、“實例”意味著什么呢?最現(xiàn)實的一件事是:在程序中,每個對象需要有自己的存儲空間,以保存它們自己的屬性值。我們說同類對象具有相同的屬性與服務(wù),是指它們的定義形式相同,而不是說每個對象的屬性值都相同。讀者可以對照非OO語言中的類型(type)與變量(variable)之間的關(guān)系來理解類和對象,二者十分相似,都是集合與成員、抽象描述與具體實例的關(guān)系。多數(shù)情況下,類型用于定義數(shù)據(jù),類用于定義對象。有些面向?qū)ο蟮木幊陶Z言,既有類的概念也有類型概念。比如在C++中,用類定義對象,用類型定義對象的成員變量。但是也有少數(shù)面向?qū)ο缶幊陶Z言(例如ObjectPascal)不采用類的概念,對象和普通數(shù)據(jù)都是用類型定義的。事物(對象)既具有共同性,也具有特殊性。運用抽象的原則舍棄對象的特殊性,抽取其共同性,則得到一個適應(yīng)一批對象的類。如果在這個類的范圍內(nèi)考慮定義這個類時舍棄的某些特殊性,則在這個類中只有一部分對象具有這些特殊性,而這些對象彼此是共同的,于是得到一個新的類。它是前一個類的子集,稱作前一個類的特殊類。而前一個類稱作這個新類的一般類,這是從一般類發(fā)現(xiàn)特殊類,也可以從特殊到一般??紤]若干類所具有的彼此共同的特征,舍棄它們彼此不同的特殊性,則得到這些類的一般類。一般類和特殊類是相對而言的,它們之間是一種真包含的關(guān)系(即特殊類是一般類的一個真子集)。如果兩個類之間沒有這種關(guān)系,就談不上一般和特殊。特殊類具有它的一般類的全部特征,同時又具有一些只適應(yīng)于本類對象的獨特特征。在OO方法中關(guān)于一般類與特殊類的定義是:如果類A具有類B的全部屬性和全部服務(wù),而且具有自己特有的某些屬性或服務(wù),貝0A叫做B的特殊類,B叫做A的一般類。這個定義也可用另一種方式給出。如果類A的全部對象都是類B的對象,而且類B中存在不屬于類A的對象,則A是B的特殊類,B是A的一般類。以上兩個定義是等價的,但從軟件開發(fā)的角度看,前一個定義運用起來將更加方便??紤]輪船、客輪這兩個類,輪船具有噸位、時速、吃水線等屬性并具有行駛、停泊等服務(wù);客輪具有輪船的全部屬性與服務(wù),又有自己的特殊屬性(如載客量)和服務(wù)(如供餐)。所以客輪是輪船的特殊類,輪船是客輪的一般類。與一般類/特殊類等價的其他術(shù)語有超類/子類、基類/派生類、祖先類/后裔類等。1.3封裝封裝是面向?qū)ο蠓椒ǖ囊粋€重要原則,它有兩個涵義。第一個涵義是,把對象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個不可分割的獨立單位(即對象);第二個涵義也稱作“信息隱蔽”,即盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一個邊界(或者說形成一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系。這主要是指對象的外部不能直接地存取對象的屬性,只能通過幾個允許外部使用的服務(wù)與對象發(fā)生聯(lián)系。用比較簡練的語言給出封裝的定義就是:封裝就是把對象的屬性和服務(wù)結(jié)合成一個獨立系統(tǒng)單位,并盡可能隱蔽對象的內(nèi)部細節(jié)。用“售報亭”對象描述現(xiàn)實中的一個售報亭,它的屬性是亭內(nèi)的各種報刊(其名稱、定價)和錢箱(總金額),它有兩個服務(wù)一一報刊零售和款貨清點。封裝意味著,這些屬性和服務(wù)結(jié)合成一個不可分的整體一售報亭對象。它對外有一道邊界,即亭子的隔板,并留一個接口,即售報窗口,這里提供報刊零售服務(wù)。顧客只能從這個窗口要求提供服務(wù),而不能自己伸手到亭內(nèi)拿報紙和找零錢??钬浨妩c是一個內(nèi)部服務(wù),不向顧客開放。封裝的原則具有很重要的意義,對象的屬性和服務(wù)緊密結(jié)合反映了這樣一個基本事實:事物的靜態(tài)特征和動態(tài)特征是事物不可分割的兩個側(cè)面,系統(tǒng)中把對象看成它的屬性和服務(wù)的結(jié)合體,就使對象能夠集中而完整地描述并對應(yīng)一個具體的事物。以往有些方法把數(shù)據(jù)和功能分離開進行處理,很難具有這種對應(yīng)性。封裝的信息隱蔽作用反映了事物的相對獨立性。當(dāng)我們站在對象以外的角度觀察一個對象時,只需要注意它對外呈現(xiàn)什么行為(做什么),而不必關(guān)心它的內(nèi)部細節(jié)(怎么做)。規(guī)定了它的職責(zé)之后,就不應(yīng)該隨意從外部插手去改動它的內(nèi)部信息或干預(yù)它的工作。封裝的原則在軟件上的反映是要求使對象以外的部分不能隨意存取對象的內(nèi)部數(shù)據(jù)(屬性),從而有效地避免了外部錯誤對它的交叉感染”,使軟件錯誤能夠局部化,因而大大減少了查錯和排錯的難度(在售報亭的例子中如果沒有一道圍板,行人的一個錯誤可能使報刊或錢箱不翼而飛)。另一方面,當(dāng)對象的內(nèi)部需要修改時,由于它只通過少量的服務(wù)接口對外提供服務(wù),因此大大減少了內(nèi)部的修改對外部影響,即減小了修改引起的“波動效應(yīng)”。封裝是面向?qū)ο蠓椒ǖ囊粋€原則,也是面向?qū)ο蠹夹g(shù)必須提供的一種機制。例如在面向?qū)ο笳Z言中,要求把屬性和服務(wù)結(jié)合起來定義成一個程序單位,并通過編譯系統(tǒng)保證對象的外部不能直接存取對象的屬性或調(diào)用它的內(nèi)部服務(wù)。這種機制就叫作封裝機制。與封裝密切相關(guān)的一個術(shù)語是可見性,它是指對象的屬性和服務(wù)允許對象外部存取和引用的程度。我們已經(jīng)討論了封裝的好處,然而封裝也有它的副作用。如果強調(diào)嚴格的封裝,則對象的任何屬性都不允許外部直接存取,因此就要增加許多沒有其他意義,只負責(zé)讀或?qū)懙姆?wù)。這為編程工作增加了負擔(dān),增加了運行開銷,并且使程序顯得臃腫。為了避免這點,語言往往采取一種比較現(xiàn)實的靈活態(tài)度一一允許對象有不同程度的可見性??梢娦缘拇鷥r是放棄封裝所帶來的好處。各種語言采取了不同的作法。純OO的編程語言一般采取嚴格的封裝(如Smalltalk);混合型00編程語言有的完全可見(如objectpascal和Objective-C);有的采取折中方案,即允許程序員指定哪些屬性和服務(wù)是可見的,哪些是不可見的(如C++)。目前看來,折中的作法最受用戶歡迎。1.4繼承繼承是00方法中的一個十分重要的概念,并且是00技術(shù)可提高軟件開發(fā)效率的重要原因之一,其定義是:特殊類的對象擁有其一般類的全部屬性與服務(wù),稱作特殊類對一般類的繼承。繼承意味著“自動地擁有”,或曰“隱含地復(fù)制”。就是說,特殊類中不必重新定義已在它的一般類中定義過的屬性或服務(wù),而它卻自動地、隱含地擁有其一般類的所有屬性與服務(wù)。00方法的這種特性稱作對象的繼承性。從一般類和特殊類的定義可以看到,后者對前者的繼承邏輯上是必然的。繼承的實現(xiàn)則是通過00系統(tǒng)(例如00PL)的繼承機制來保證的。一個特殊類即有自己新定義的屬性和服務(wù),又有從它的一般類中繼承下來的屬性與服務(wù)。繼承來的屬性和服務(wù),盡管是隱式的(不用書寫出來),但是無論在感念上還是在實際效果上,都確確實實地是這個類的屬性和服務(wù)。當(dāng)這個特殊類又被它更下層的特殊類繼承時,它繼承來的和自己定義的屬性和服務(wù)又都一起被更下層的類繼承下去。也就是說,繼承關(guān)系是傳遞的。繼承具有重要的實際意義,它簡化了人們對事物的認識和描述,比如我們認識了輪船的特征之后,在考慮客輪時只要我們知道客輪也是一種輪船這個事實,那就認為它理所當(dāng)然的具有輪船的全部一般特征,只需要把精力用于發(fā)現(xiàn)和描述客輪獨有的那些特征。在軟件開發(fā)過程,在定義特殊類時,不需把它的一般類已經(jīng)定義過的屬性和服務(wù)重復(fù)地書寫一遍,只需要聲明它是某個類的特殊類,并定義它自己的特殊屬性與服務(wù)。無疑這將明顯地減輕開發(fā)工作的強度。繼承對于軟件復(fù)用是很有益的。在開發(fā)一個系統(tǒng)時,使特殊類繼承一般類,這本身就是軟件復(fù)用,然而其復(fù)用意義不僅如此,如果把用OO方法開發(fā)的類作為可復(fù)用構(gòu)件提交到構(gòu)件庫,那么在開發(fā)新系統(tǒng)時不僅可以直接地復(fù)用這個類,還可以把它作為一般類,通過繼承而實現(xiàn)復(fù)用,從而大大擴展了復(fù)用范圍。一個類可以是多個一般類的特殊類,它從多個一般類中繼承了屬性與服務(wù),這種繼承模式叫多繼承。這種情況是常??梢杂龅降摹@缥覀冇辛溯喆涂瓦\工具兩個一般類。在考慮客輪這個類時就可以發(fā)現(xiàn),客輪既是一種輪船,又是一種客運工具。所以它可以同時作為輪船和客運工具這兩個類的特殊類。在開發(fā)這個類時,如果能讓它同時繼承輪船和客運工具這兩個類的屬性與服務(wù),則需要為它新增加的屬性和服務(wù)就更少了。這無疑將進一步提高開發(fā)效率。但在實現(xiàn)時能不能做到這一點卻取決于編程語言是否支持多繼承。繼承是任何一種OOPL必須具備的功能,多繼承則未必,現(xiàn)在有許多OOPL只能支持單繼承而不能支持多繼承。多繼承無論從概念上還是從技術(shù)上都是單繼承的推廣。用集合論的術(shù)語解釋多繼承結(jié)構(gòu),即具有多個一般類的特殊類是它各個一般類交集的一個子集(可能是真子集,也可能等于這個交集)。多繼承模式在現(xiàn)實中是很常見的,但系統(tǒng)開發(fā)是否采用多繼承受到OOPL功能的影響。目前比較現(xiàn)實的作法是,在OOA階段如實地用多繼承結(jié)構(gòu)描述問題域中的多繼承現(xiàn)象,從而使系統(tǒng)模型與問題域具有良好的對應(yīng)。在考慮實現(xiàn)時,如果決定選用一種僅支持單繼承的語言,則把多繼承轉(zhuǎn)化為單繼承。與多繼承相關(guān)的一個問題是“命名沖突”問題。所謂命名沖突是指當(dāng)一個特殊類繼承了多個一般類時,如果這些一般類中的屬性或服務(wù)有彼此同名的現(xiàn)象,則當(dāng)特殊類中引用這樣的屬性名或者服務(wù)名時,系統(tǒng)無法判定它的語義到底是指哪個一般類中的屬性和服務(wù)。解決的辦法有兩種,一是不允許多繼承結(jié)構(gòu)中的各個一般類的屬性及服務(wù)取相同的名字,這會為開發(fā)者帶來一些不便。二是由OOPL提供一種更名機制,使程序可以在特殊類中更換從各個一般
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度消防水泵房改造與維護合同協(xié)議書3篇
- 【全程復(fù)習(xí)方略】2020年高考化學(xué)單元評估檢測(八)(人教版-四川專供)
- 響應(yīng)面分析軟件
- 【2021屆備考】2020年全國各地名校生物試題分類解析匯編:J單元-生物與環(huán)境
- 【金版學(xué)案】2014-2021學(xué)年人教版高中英語選修七練習(xí):Unit-2-第四學(xué)時-Grammar
- 工作計劃表模板(共6篇)
- 外協(xié)加工作業(yè)流程
- 音像制品租賃的庫存流動性考核試卷
- 高強度金屬加工技術(shù)及設(shè)備考核試卷
- 虛擬網(wǎng)絡(luò)性能調(diào)優(yōu)-洞察分析
- 普通地質(zhì)學(xué)教材
- 《并聯(lián)機器人運動學(xué)》
- 中國聯(lián)通動環(huán)監(jiān)控系統(tǒng)C接口-0812
- GB/T 30680-2014氟橡膠板通用技術(shù)條件
- 41.脅痛(膽囊結(jié)石)中醫(yī)臨床路徑
- 車間現(xiàn)場安全培訓(xùn)內(nèi)容課件參考
- 油藏工程-油藏物質(zhì)平衡方法-1課件
- 三上書法《撇》教學(xué)課件
- 河北省廊坊市藥品零售藥店企業(yè)藥房名單目錄
- 超星爾雅學(xué)習(xí)通《三國志導(dǎo)讀》章節(jié)測試(含答案)
- 簡單的個人原因辭職報告(通用17篇)
評論
0/150
提交評論