面向?qū)ο蠓缎蚠第1頁(yè)
面向?qū)ο蠓缎蚠第2頁(yè)
面向?qū)ο蠓缎蚠第3頁(yè)
面向?qū)ο蠓缎蚠第4頁(yè)
面向?qū)ο蠓缎蚠第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

面向?qū)ο蠓缎透攀雒嫦驅(qū)ο蠓缎鸵詫?duì)象概念為中心,一切都集中在對(duì)象上。編寫(xiě)代碼時(shí)是圍繞對(duì)象而非函數(shù)進(jìn)行組織的。對(duì)象是什么?對(duì)象傳統(tǒng)上被定義為帶有方法(面向?qū)ο箢I(lǐng)域稱(chēng)呼函數(shù)的術(shù)語(yǔ))的數(shù)據(jù)。糟糕的是,這是一種非常有局限性的對(duì)象觀。稍后我會(huì)給出一個(gè)更好的對(duì)象定義。我說(shuō)到對(duì)象的數(shù)據(jù)時(shí),可能指數(shù)值和字符串這樣的簡(jiǎn)單事物,也可能指其他對(duì)象。使用對(duì)象的優(yōu)點(diǎn)在于,可以定義自己負(fù)責(zé)自己的事物(參見(jiàn)表1-2)。對(duì)象天生就知道自己的類(lèi)型。對(duì)象中的數(shù)據(jù)能夠告訴它自己的狀態(tài)如何,而對(duì)象中的代碼能夠使它正確工作(也就是說(shuō),做要求它做的事情)。表1-2對(duì)象及其責(zé)任對(duì)象責(zé)任Student知道自己所在的教室知道自己下堂課的教室從一個(gè)教室去下一個(gè)教室Instructor告訴學(xué)生到下堂課的教室去Classroom有明確地址在這種情況下,對(duì)象是通過(guò)尋找在問(wèn)題領(lǐng)域中的實(shí)體而被發(fā)現(xiàn)的。然后再通過(guò)查看這些實(shí)體需要做些什么,為每個(gè)對(duì)象確定責(zé)任(或者稱(chēng)方法)。這與通過(guò)在需求中尋找名詞發(fā)現(xiàn)對(duì)象和通過(guò)尋找動(dòng)詞發(fā)現(xiàn)方法的技術(shù)是一致的。隨著所遇到問(wèn)題更加復(fù)雜,我們將看到,這種技術(shù)存在很大局限性,本書(shū)中我會(huì)給出一種更好的方式。但是現(xiàn)在我們還要從此方式開(kāi)始入手。怎么理解對(duì)象?理解對(duì)象的最佳方式,是將其看成'具有責(zé)任的東西”。有一條好的設(shè)計(jì)規(guī)則:對(duì)象應(yīng)該自己負(fù)責(zé)自己,而且應(yīng)該清楚地定義責(zé)任。這就是我之所以說(shuō)Student對(duì)象的責(zé)任之一是知道怎樣從一個(gè)教室去下一個(gè)教室”的原因?;蛘撸褂肍owler的視角,還可以用MartinFowler的視角框架來(lái)觀察對(duì)象:使用對(duì)象將責(zé)任轉(zhuǎn)移到更局部的層次,在概念層次上,對(duì)象是一組責(zé)任;在規(guī)約層次上,對(duì)象是一組可以被其他對(duì)象或?qū)ο笞约赫{(diào)用的方法(也稱(chēng)行為)。在實(shí)現(xiàn)層次上,對(duì)象是代碼和數(shù)據(jù),以及它們之間的計(jì)算交互。糟糕的是,人們對(duì)面向?qū)ο笤O(shè)計(jì)的教學(xué)和討論更多的是停留在實(shí)現(xiàn)層次一一也就是只考慮代碼和數(shù)據(jù),對(duì)概念層次和規(guī)約層次重視很不夠。然而,從后兩種層次去思考對(duì)象其實(shí)也具有巨大的效力。對(duì)象具有供其他對(duì)象使用的接口:因?yàn)閷?duì)象具有責(zé)任而且自己負(fù)責(zé)自己,所以必須有辦法告訴對(duì)象要做什么。對(duì)象含有說(shuō)明自己狀態(tài)的數(shù)據(jù),還有實(shí)現(xiàn)必要功能的方法。對(duì)象的很多方法都將標(biāo)識(shí)為可被其他對(duì)象調(diào)用。這些方法的集合就稱(chēng)為對(duì)象的公開(kāi)接口(publicinterface)0例如,在教室的例子中,我可以編寫(xiě)含有一個(gè)gotoNextClassroom()方法的Student對(duì)象。我們不需要向這個(gè)方法傳遞任何參數(shù),因?yàn)槊總€(gè)Student對(duì)象都自己負(fù)責(zé)自己。也就是說(shuō),Student對(duì)象知道:==為了能夠找到下一個(gè)教室,它需要什么。==怎樣為完成這個(gè)任務(wù)獲取所需的其他信息。圍繞類(lèi)組織對(duì)象剛開(kāi)始,只有一種學(xué)生一一普通學(xué)生需要從一個(gè)教室到另一個(gè)教室去。請(qǐng)注意,在我們的教室(我們的系統(tǒng))中可能有很多這樣的“普通學(xué)生”。當(dāng)然可以每個(gè)學(xué)生都有一個(gè)對(duì)象對(duì)應(yīng),從而能夠容易地和分別地跟蹤每個(gè)學(xué)生的狀態(tài)。但是,要求每個(gè)Student對(duì)象都有自己的一組方法,告訴它能做什么和怎樣做,顯然效率很低,尤其是在對(duì)所有學(xué)生而言任務(wù)都一樣的時(shí)候。一種效率更高的辦法是,讓所有學(xué)生與一組方法關(guān)聯(lián)起來(lái),每個(gè)學(xué)生都可以根據(jù)自己的需要使用或修改這些方法。我希望定義一個(gè)'一般學(xué)生”來(lái)包含這些公共方法的定義。然后,可以有各種各樣特殊的學(xué)生,每個(gè)特殊學(xué)生都必須掌握自己的私有信息。在面向?qū)ο笮g(shù)語(yǔ)中,這種“一般學(xué)生”被稱(chēng)為類(lèi)(class)。類(lèi)就是對(duì)對(duì)象行為的定義,它包含以下內(nèi)容的完整描述:1、 對(duì)象所包含的數(shù)據(jù)元素。2、 對(duì)象能夠操作的方法。3、 訪問(wèn)這些數(shù)據(jù)元素和方法的方式。因?yàn)閷?duì)象所包含的數(shù)據(jù)元素可以不同,所以同一類(lèi)型的對(duì)象可以含有不同數(shù)據(jù),但它們都具有相同的功能(如方法所定義)。對(duì)象是類(lèi)的實(shí)例要獲得一個(gè)對(duì)象時(shí),我告訴程序需要某個(gè)類(lèi)型(type,也就是對(duì)象所屬的類(lèi))的一個(gè)新對(duì)象,這個(gè)新對(duì)象稱(chēng)為類(lèi)的一個(gè)實(shí)例(instance)。創(chuàng)建類(lèi)實(shí)例的過(guò)程稱(chēng)為實(shí)例化(instantiation)0在例子中使用對(duì)象使用面向?qū)ο蠓椒椤叭ハ绿谜n教室”的例子編程比以前的方法簡(jiǎn)單多了。步驟將如下所示:1.開(kāi)始控制程序。實(shí)例化室中學(xué)生的集合。告訴此集合,讓學(xué)生去自己下堂課的教室。集合讓每個(gè)學(xué)生去自己下堂課的教室。每個(gè)學(xué)生都:找到自己下堂課的教室在哪里;決定怎么去;去那里。完成。抽象類(lèi)型的需要在需要加入另一個(gè)學(xué)生類(lèi)型比如研究生之前,這一方式能夠很好地工作。遇到難題了。看起來(lái)我們必須允許任何類(lèi)型的學(xué)生(普通學(xué)生或者研究生)加入這個(gè)集合。但我們面臨的問(wèn)題是,怎樣讓集合引用其元素呢?因?yàn)槲覀兪窃谟懻撊绾斡么a實(shí)現(xiàn),這時(shí)集合實(shí)際上將是包含某個(gè)類(lèi)型對(duì)象的數(shù)組或其他容器。如果集合命名為RegularStudent(普通學(xué)生)之類(lèi),我們就不能將GraduateStudent(研究生)類(lèi)型的對(duì)象放入集合。如果說(shuō)集合僅僅是一組對(duì)象,又怎么確定其中不包含類(lèi)型錯(cuò)誤的對(duì)象(即不能“去下堂課的教室”)呢?解決方案很直截了當(dāng)。我需要一個(gè)能包容多種具體類(lèi)型的一般類(lèi)型。在本例中,我們需要一個(gè)包含RegularStudent對(duì)象和GraduateStudent對(duì)象的Student類(lèi)型。在面向?qū)ο蟮男g(shù)語(yǔ)中,我們稱(chēng)Student類(lèi)為抽象類(lèi)(abstractclass)抽象類(lèi)定義了一組類(lèi)可以做什么抽象類(lèi)定義了其他一些相關(guān)類(lèi)的行為。這些“其他”類(lèi)是代表了某種特殊類(lèi)型的相關(guān)行為的類(lèi)。這樣的類(lèi)通常被稱(chēng)為具體類(lèi)(concreteclass),因?yàn)樗碇粋€(gè)概念特定的、不變的實(shí)現(xiàn)。在本例中,Student就是抽象類(lèi)。具體類(lèi)RegularStudent和GraduateStudent則代表了兩種類(lèi)型的StudentoRegularStudent是一種Student,GraduateStudent也是一種Student0這種關(guān)系叫做is-a(是一個(gè)/種)關(guān)系,是我們稱(chēng)之為繼承(inheritance)關(guān)系的一種特例。于是,我們說(shuō)RegularStudent類(lèi)繼承自Student類(lèi)。其他類(lèi)似的說(shuō)法還有:GraduateStudent派生自Student類(lèi),Graduate-Student特化(specialize)了Student類(lèi),或者GraduateStudent是Student的子類(lèi)。而另一方面,我們說(shuō)Student類(lèi)是GraduateStudent類(lèi)和RegularStudent的基類(lèi),Student類(lèi)泛化(generalize)了二者,或者Student類(lèi)是GraduateStudent類(lèi)和RegularStudent的超類(lèi)(superclass)。抽象類(lèi)可以充當(dāng)其他類(lèi)的占位符抽象類(lèi)可以充當(dāng)其他類(lèi)的占位符。可以使用抽象類(lèi)定義其派生類(lèi)必須實(shí)現(xiàn)的方法。抽象類(lèi)還可以包含所有派生類(lèi)都能夠使用的公共方法。[派生類(lèi)是使用抽象類(lèi)的默認(rèn)行為還是使用自己的有所變化的行為,由派生類(lèi)自己決定(這與'對(duì)象自己負(fù)責(zé)自己”的要求一致)。這就意味著,我可以在控制程序中編寫(xiě)一些對(duì)象,它們的引用類(lèi)型都是Student。編譯器能夠檢查Student引用所指向的是否真的是一種Studento這種機(jī)制使我們能夠?qū)崿F(xiàn)魚(yú)與熊掌兼得,同時(shí)獲得了三方面的優(yōu)點(diǎn):1、 集合只需處理Student對(duì)象(從而使Instructor對(duì)象也只需要處理Student對(duì)象)。2、 但是類(lèi)型檢查仍然存在(只有能夠“去下堂課教室”的Student對(duì)象會(huì)包含進(jìn)來(lái))。3、 而且每一種Student都可以按自己的方式實(shí)現(xiàn)功能。抽象類(lèi)不只是不能實(shí)例化抽象類(lèi)經(jīng)常被描述為“不能實(shí)例化的類(lèi)”。這個(gè)定義本身沒(méi)錯(cuò)——在實(shí)現(xiàn)層次上。但是局限性太大了。在概念層次上定義抽象類(lèi)會(huì)更有幫助。在概念層次,抽象類(lèi)就是(實(shí)現(xiàn)抽象類(lèi)所代表的概念的)其他類(lèi)的占位符。也就是說(shuō),抽象類(lèi)為我們提供了一種方法,能夠給一組相關(guān)的類(lèi)賦予一個(gè)名字。這使我們能夠?qū)⑦@一組相關(guān)類(lèi)看成一個(gè)概念。在面向?qū)ο蠓缎椭校仨毧偸菑母拍睢⒁?guī)約和實(shí)現(xiàn)所有三個(gè)視角層次來(lái)思考問(wèn)題。可見(jiàn)性因?yàn)閷?duì)象都自己負(fù)責(zé)自己,所以有很多東西不需要暴露給其他對(duì)象。前面我們?cè)岬焦_(kāi)接口一一可以被其他對(duì)象訪問(wèn)的方法的概念。在面向?qū)ο笙到y(tǒng)中,可訪問(wèn)性主要分為以下幾種類(lèi)型:公開(kāi)(public) 任何對(duì)象都能夠看見(jiàn)。保護(hù)(protected) 只有這個(gè)類(lèi)及其派生類(lèi)的對(duì)象能夠看見(jiàn)。私有(private) 只有這個(gè)類(lèi)的對(duì)象能夠看見(jiàn)。這就引出了封裝(encapsulation)的概念。封裝經(jīng)常被簡(jiǎn)單地描述成“數(shù)據(jù)隱藏”。一般而言,對(duì)象不應(yīng)該將內(nèi)部數(shù)據(jù)成員暴露給外部世界。(也就是說(shuō),其可見(jiàn)性是protected或privateo)封裝但封裝可不只是指數(shù)據(jù)隱藏。封裝一般意味著各種隱藏。在本例中,講師不知道哪些是普通學(xué)生,哪些是研究生。所以學(xué)生的類(lèi)型對(duì)講師隱藏了。(也就是說(shuō),我封裝了學(xué)生的類(lèi)型)。在面向?qū)ο笳Z(yǔ)言中,抽象類(lèi)Student將隱藏從其派生的類(lèi)的類(lèi)型。這是一個(gè)非常重要的概念。多態(tài)另一個(gè)要理解的術(shù)語(yǔ)是多態(tài)(polymorphism)o在面向?qū)ο笳Z(yǔ)言中,我們經(jīng)常用抽象類(lèi)類(lèi)型的引用來(lái)引用對(duì)象。但是,我們真正引用的是從抽象類(lèi)派生的類(lèi)的具體實(shí)例。因此,當(dāng)我們通過(guò)抽象引用概念性地要求對(duì)象做什么時(shí),將得到不同的行為,具體行為取決于派生對(duì)象的具體類(lèi)型。“多態(tài)”這個(gè)詞來(lái)源于“poly”(意為“很多”)和“morph"(意為“形態(tài)”)。因此,它的意思是'很多形態(tài)”。這個(gè)名稱(chēng)非常合適,因?yàn)橥粋€(gè)調(diào)用能夠獲得很多不同形態(tài)的行為。在本例中,講師告訴學(xué)生'去下堂課的教室”。但是,根據(jù)學(xué)生類(lèi)型的不同,他們會(huì)采取不同的行為(因此出現(xiàn)了多態(tài))。面向?qū)ο笮g(shù)語(yǔ)回顧術(shù)語(yǔ)描述類(lèi)(class)與抽象類(lèi)(abstractclass)根據(jù)對(duì)象所具有的責(zé)任定義對(duì)象的類(lèi)型。責(zé)任可以分為行為和/或狀態(tài)。這些分別是由方法和/或數(shù)據(jù)實(shí)現(xiàn)的;抽象類(lèi)則定義了一組相關(guān)類(lèi)的行為具體類(lèi)(concreteclass)實(shí)現(xiàn)抽象類(lèi)某一特定類(lèi)型行為的類(lèi)。具體類(lèi)是一個(gè)概念特定、不變的實(shí)現(xiàn)封裝(encapsulation)通常定義為數(shù)據(jù)隱藏,但最好將它看作任何形式的隱藏(類(lèi)型、實(shí)現(xiàn)和設(shè)計(jì)等等)繼承(inheritance)一個(gè)類(lèi)繼承另一個(gè)類(lèi),是指它接受了該類(lèi)的一些或者所有性質(zhì)。起始類(lèi)稱(chēng)為基類(lèi)、超類(lèi)、父類(lèi)或者泛化類(lèi),而繼承類(lèi)稱(chēng)為派生類(lèi)、子類(lèi)或者特化類(lèi)實(shí)例(instance)類(lèi)的特例(總是一個(gè)對(duì)象)。類(lèi)的特殊實(shí)例或者實(shí)體。每個(gè)對(duì)象都有自己的狀態(tài)。因此同一個(gè)類(lèi)型(類(lèi))可以有幾個(gè)對(duì)象*實(shí)例化(instantiation)創(chuàng)建類(lèi)的一個(gè)實(shí)例的過(guò)程接n(interface)接口與類(lèi)類(lèi)似,但是只為其成員提供規(guī)約而不提供實(shí)現(xiàn)。它與只含有抽象成員的抽象類(lèi)很相似。編程的時(shí)候,如果需要幾個(gè)類(lèi)共享公共基類(lèi)中沒(méi)有的一些特性,而且希望確保每個(gè)類(lèi)自己實(shí)現(xiàn)這些特性(因?yàn)樗谐蓡T都是抽象的),就應(yīng)該使用接口視角(perspective)觀察對(duì)象有三種視角:概念視角、規(guī)約視角和實(shí)現(xiàn)視角。這三個(gè)不同層次的區(qū)別在理解抽象類(lèi)與其派生類(lèi)之間的關(guān)系上用處很大。抽象類(lèi)定義了如何在概念層次上解決問(wèn)題,還提供了與任何派生對(duì)象通信的規(guī)約。每個(gè)派生類(lèi)都按需要提供特定的實(shí)現(xiàn)能夠用一種方式引用一個(gè)類(lèi)的不同派生類(lèi),但獲得的行為對(duì)應(yīng)于所引用的派生類(lèi)多態(tài)(polymorphism)能夠用一種方式引用一個(gè)類(lèi)的不同派生類(lèi),但獲得的行為對(duì)應(yīng)于所引用的派生類(lèi)*有些面向?qū)ο蠓治鋈藛T說(shuō)萬(wàn)事萬(wàn)物皆對(duì)象:類(lèi)是對(duì)象,實(shí)例也是對(duì)象。這在技術(shù)上可能是正確的,但是卻成了混淆和發(fā)生爭(zhēng)議的地方。這里所稱(chēng)的對(duì)象是類(lèi)的實(shí)例。我們已經(jīng)討論了可能被其他對(duì)象或?qū)ο笞约赫{(diào)用的方法,但是當(dāng)對(duì)象創(chuàng)建時(shí)到底發(fā)生了什么事情?當(dāng)它消亡時(shí)又發(fā)生了什么?如果對(duì)象應(yīng)該是自成一體的單位,那么它自己包含處理這些情況的方法,將是一個(gè)不錯(cuò)的主意。這些特殊方法事實(shí)上確實(shí)存在,它們就是構(gòu)造函數(shù)(constructor)和析構(gòu)函數(shù)(destructor,或者終結(jié)方法,finalizer)。構(gòu)造函數(shù)負(fù)責(zé)初始化或創(chuàng)建一個(gè)對(duì)象構(gòu)造函數(shù)是對(duì)象創(chuàng)建時(shí)自動(dòng)調(diào)用的一個(gè)特殊方法,它的目的是處理對(duì)象起始時(shí)的工作,這是對(duì)象“自己負(fù)責(zé)自己”所要求的。構(gòu)造函數(shù)是一個(gè)進(jìn)行初始化、設(shè)置默認(rèn)信息、設(shè)定與其他對(duì)象關(guān)系或創(chuàng)建定義一個(gè)明確的對(duì)象所需的其他工作的天然場(chǎng)所。所有面向?qū)ο笳Z(yǔ)言都會(huì)在創(chuàng)建對(duì)象時(shí)查找并執(zhí)行相應(yīng)的構(gòu)造函數(shù)。通過(guò)正確使用構(gòu)造函數(shù),可以更容易消除(或者至少最大程度地減少)未初始化變量,這種錯(cuò)誤通常源于開(kāi)發(fā)者的粗心大意。如果代碼中有一個(gè)固定且一致的地方(即對(duì)象的構(gòu)造函數(shù))進(jìn)行所有的初始化工作,可以更容易地確保初始化。未初始化變量所引起的錯(cuò)誤很容易改正,但很難發(fā)現(xiàn),因此這種約定(以及構(gòu)造函數(shù)的自動(dòng)調(diào)用)能夠提高程序員的效率。析構(gòu)函數(shù)(終結(jié)方法)在對(duì)象不再需要時(shí)(已被刪除時(shí))將其清除大多數(shù)面向?qū)ο笳Z(yǔ)言都提供了對(duì)象不再存在時(shí)清除該對(duì)象的方式。在C++和C#中稱(chēng)之為析構(gòu)函數(shù),在Java中稱(chēng)之為終結(jié)方法。所有面向?qū)ο笳Z(yǔ)言都會(huì)在對(duì)象刪除時(shí)查找并執(zhí)行相應(yīng)的析構(gòu)函數(shù)。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)的使用也是對(duì)象“自己負(fù)責(zé)自己”所要求的。析構(gòu)函數(shù)通常用于在對(duì)象不再需要時(shí)釋放資源。因?yàn)镴ava有垃圾收集機(jī)制(對(duì)象不再使用時(shí)自動(dòng)清除),析構(gòu)函數(shù)在Java中不像C++中那么重要。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論