面向?qū)ο蠓治龊驮O(shè)計(jì)_第1頁
面向?qū)ο蠓治龊驮O(shè)計(jì)_第2頁
面向?qū)ο蠓治龊驮O(shè)計(jì)_第3頁
面向?qū)ο蠓治龊驮O(shè)計(jì)_第4頁
面向?qū)ο蠓治龊驮O(shè)計(jì)_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蠓治鲈O(shè)計(jì)主講人:馮新?lián)P第1章上升到面向?qū)ο驛nApproachtotheObjectOrientation-3-內(nèi)容安排課程介紹第一個(gè)案例對(duì)象技術(shù)對(duì)象和類對(duì)象技術(shù)相關(guān)原則上升到面向?qū)ο?4-課程目標(biāo)三大目標(biāo):OO:建立對(duì)象的思維方式,對(duì)面向?qū)ο笏枷牒屠碚撚羞M(jìn)一步的理解UML:能夠熟練地使用UML表達(dá)面向?qū)ο蟮脑O(shè)計(jì)思想Model:運(yùn)用對(duì)象技術(shù)的一般原則和模式進(jìn)行應(yīng)用系統(tǒng)的分析和設(shè)計(jì)建模-5-課程目標(biāo)(續(xù))三大目標(biāo)之間的關(guān)系Model:建模是最終目的OO:面向?qū)ο蠹夹g(shù)是一種建模理論UML:統(tǒng)一建模語言是一種體現(xiàn)OO的建模語言,是將OO理論轉(zhuǎn)化為實(shí)踐的工具-6-關(guān)于本課程…本課程是軟件工程類專業(yè)課程,側(cè)重于工程實(shí)踐能力的培養(yǎng),強(qiáng)調(diào)分析和設(shè)計(jì)技能,不關(guān)注文檔、過程、規(guī)范等,重點(diǎn)在建模方法的應(yīng)用過程驅(qū)動(dòng):圍繞分析和設(shè)計(jì)過程,關(guān)注各階段建模技術(shù)的應(yīng)用案例驅(qū)動(dòng):圍繞具體案例,講解面向?qū)ο蠓治龊驮O(shè)計(jì)的思維方式和解決問題的方法課程重點(diǎn)不是理論或知識(shí),而是通過實(shí)踐建立對(duì)象思維方式,并培養(yǎng)運(yùn)用UML來表達(dá)這種思維方式的技能,從而完成面向?qū)ο蠓治龊驮O(shè)計(jì)通過課外閱讀、作業(yè)和實(shí)踐來彌補(bǔ)課堂不足不考概念,不需死記硬背,在實(shí)踐中掌握相關(guān)理論和方法-7-為什么選擇本課程?需要理由嗎?我們從事軟件行業(yè)面向?qū)ο笫亲钪髁鞯能浖_發(fā)思想U(xiǎn)ML是最主流的建模方法UMLOOAD軟件工程師的“飯碗”對(duì)于今天的軟件開發(fā)者來說,UML是他們的面包和黃油-8-本課程適合我?基礎(chǔ)知識(shí)儲(chǔ)備:軟件工程、面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)踐儲(chǔ)備:了解工程項(xiàng)目的特點(diǎn),最好有實(shí)際工程項(xiàng)目開發(fā)背景定位從事軟件相關(guān)行業(yè)工作:分析、設(shè)計(jì)、編碼、測(cè)試或管理、維護(hù)工作-9-課程安排1基礎(chǔ)(3):

上升到面向?qū)ο?基礎(chǔ)(3):

可視化建模技術(shù)3起源(2):

業(yè)務(wù)建模4需求(4):

用例建模5分析(3):

用例分析6設(shè)計(jì)基礎(chǔ)(3):

面向?qū)ο笤O(shè)計(jì)原則7設(shè)計(jì)基礎(chǔ)(3):

面向?qū)ο笤O(shè)計(jì)模式8設(shè)計(jì)(3):

構(gòu)架設(shè)計(jì)9設(shè)計(jì)(3):

構(gòu)件設(shè)計(jì)10實(shí)現(xiàn)&展望(3):

從模型到代碼

模型技術(shù)的發(fā)展-10-學(xué)習(xí)路線圖OOUMLOOPDP…Case-Study…學(xué)習(xí)路線圖……

……

……

……12345678910參考資料UML2面向?qū)ο蟮姆治雠c設(shè)計(jì),清華大學(xué)出版社,2013.4ApplyingUMLandPatterns-AnIntroductiontoObject-OrientedAnalysisandDesignUML和模式應(yīng)用-面向?qū)ο蠓治雠c設(shè)計(jì)導(dǎo)論Object-OrientedAnalysisandDesignwithApplications(3rd)面向?qū)ο蠓治雠c設(shè)計(jì)(第3版),UML創(chuàng)始人GradyBooch的代表作TheUnifiedModelingLanguageUserGuide(UML用戶指南,第二版)GradyBooch,JamesRumbaugh,IvarJacobson-11--12-內(nèi)容安排課程介紹第一個(gè)案例對(duì)象技術(shù)對(duì)象和類對(duì)象技術(shù)相關(guān)原則上升到面向?qū)ο?13-素?cái)?shù)問題素?cái)?shù)的定義:除了1與本身之外,不能被其他正整數(shù)整除的數(shù),叫作素?cái)?shù),也叫質(zhì)數(shù)按照習(xí)慣規(guī)定,1不算素?cái)?shù),最小的素?cái)?shù)是2,其余的是3、5、7、11、13、17、19……等等由定義判斷素?cái)?shù)對(duì)于數(shù)n,從i=2,3,4,5…到n-1判斷n能否被i整除,如果全部不能整除,則n是素?cái)?shù),只要有一個(gè)能除盡,則n不是素?cái)?shù),為了壓縮循環(huán)次數(shù),可將判斷范圍從2~n-1改為2~sqrt(n)-14-篩選法求素?cái)?shù)序列篩選法:生成2<i<n的素?cái)?shù)序列,設(shè)n=50篩掉2的倍數(shù):234567891011121314151617…篩掉3的倍數(shù):2357911131517192123252729…篩掉5的倍數(shù):23571113171923252931353741…篩掉7的倍數(shù):2357111317192329313741434749留下素?cái)?shù)序列:23571113171923293137414347-15-思考?用結(jié)構(gòu)化思維解決上述問題用對(duì)象思維解決上述問題將解決思路用合適的方式記錄下來思考:結(jié)構(gòu)化思維與對(duì)象化思維有什么本質(zhì)的不同?體現(xiàn)了怎樣的思維差異?對(duì)象思想有何優(yōu)勢(shì)?如何表達(dá)設(shè)計(jì)思想:代碼?圖形?-16-結(jié)構(gòu)化實(shí)現(xiàn)//PrimerNumber.cmain(){int*sieve,n;intiCounter=2,iMax,i;printf("Pleaseinputmaxnumber:");scanf(“%d",&n);sieve=malloc((n-1)*sizeof(int));for(i=0;i<n-1;i++){sieve[i]=i+2;}iMax=sqrt(n);while(iCounter<=iMax){for(i=2*iCounter-2;i<n-1;i+=iCounter)sieve[i]=0;iCounter++;}for(i=0;i<n-1;i++)if(sieve[i]!=0)printf("%d",sieve[i]);}-17-結(jié)構(gòu)化設(shè)計(jì)-18-結(jié)構(gòu)化小結(jié)通過流程圖(結(jié)構(gòu)化建模)可以更清楚表達(dá)設(shè)計(jì)思想針對(duì)過程的抽象過程(函數(shù))是系統(tǒng)的核心,通過過程實(shí)現(xiàn)系統(tǒng)功能數(shù)據(jù)是靜態(tài)的,由過程來控制對(duì)數(shù)據(jù)的訪問面向?qū)ο蟮姆椒ㄈ绾谓鉀Q呢?-19-Java實(shí)現(xiàn)-是對(duì)象思維嗎?importjava.lang.Math;publicclassPrimerNumber{publicstaticvoidmain(Stringargs[]){intn=50;intsieve[]=newint[n-1];intiCounter=2,iMax,i;for(i=0;i<n-1;i++){sieve[i]=i+2;}iMax=(int)Math.sqrt(n);while(iCounter<=iMax){for(i=2*iCounter-2;i<n-1;i+=iCounter)sieve[i]=0;iCounter++;}for(i=0;i<n-1;i++)if(sieve[i]!=0)System.out.println(sieve[i]);}}-20-用對(duì)象思維解決問題?篩選法:生成2<i<n的整數(shù)序列,設(shè)n=50篩掉2的倍數(shù):234567891011121314151617…篩掉3的倍數(shù):2357911131517192123252729…篩掉5的倍數(shù):23571113171923252931353741…篩掉7的倍數(shù):2357111317192329313741434749留下素?cái)?shù)序列:23571113171923293137414347篩子:存儲(chǔ)源數(shù)據(jù)過濾器:表明當(dāng)前過濾因子計(jì)數(shù)器:記錄當(dāng)前正在篩選的數(shù)據(jù)什么是對(duì)象?對(duì)象在哪?-21-這才是對(duì)象思維!抽象基類,為程序提供多態(tài)-22-面向?qū)ο蟮木幊獭狢++語法classItem{public: Item*source; Item(Item*src){source=src;}

virtualintout(){return0;}};classCounter:publicItem{ intvalue;public:

intout(){returnvalue++;} Counter(intv):Item(0){value=v;}};-23-面向?qū)ο蟮木幊?過濾器classFilter:publicItem{ intfactor;public:

intout(){ while(1){ intn=source->out(); if(n%factor)returnn; } } Filter(Item*src,intf):Item(src){factor=f;}};-24-面向?qū)ο蟮木幊?篩子classSieve:publicItem{public: intout(){ intn=source->out(); source=newFilter(source,n); returnn; } Sieve(Item*src):Item(src){}};-25-驗(yàn)證設(shè)計(jì)方案voidmain(){ Counterc(2); Sieves(&c); intnext,n; cin>>n; while(1){

next=s.out(); if(next>n)break; cout<<next<<""; } cout<<endl;}關(guān)鍵代碼只有一行,

篩子自己知道如何找出素?cái)?shù)-26-對(duì)象方法小結(jié)通過UML類圖(面向?qū)ο蠼#┛梢愿宄磉_(dá)設(shè)計(jì)思想,并為代碼實(shí)現(xiàn)提供框架針對(duì)數(shù)據(jù)的抽象:類類擁有自己的數(shù)據(jù)和行為,能夠完成自身的工作職責(zé)過程是類的組成部分,為類提供行為通過類的對(duì)象之間的協(xié)作完成系統(tǒng)功能-27-對(duì)象技術(shù)的思考對(duì)象思維具有更大的靈活性,更好的模塊化,可以進(jìn)行更大規(guī)模的設(shè)計(jì)面向?qū)ο笤O(shè)計(jì)和開發(fā)的難度更大,面臨著對(duì)象識(shí)別、職責(zé)分配、多態(tài)抽象等一系列問題學(xué)習(xí)更多知識(shí)和技術(shù),并掌握一系列面向?qū)ο蟮脑O(shè)計(jì)原則和模式圖形化工具(UML)有助于表達(dá)和交流設(shè)計(jì)思想,并簡(jiǎn)化實(shí)現(xiàn)的過程-28-總結(jié):結(jié)構(gòu)化VS面向?qū)ο蠼Y(jié)構(gòu)化思維用過程刻畫數(shù)據(jù)間關(guān)系對(duì)象思維直接用類表達(dá)數(shù)據(jù)間關(guān)系結(jié)構(gòu)化中,數(shù)據(jù)是死的,全部依賴算法操作對(duì)象思維中,數(shù)據(jù)是活的,“她”知道自己的信息(屬性),并能完成自己的工作(操作)結(jié)構(gòu)化思維更像是一個(gè)人在解決所有問題對(duì)象思維更像是一個(gè)團(tuán)隊(duì)的分工協(xié)作-29-面向?qū)ο骎S結(jié)構(gòu)化-1揚(yáng)棄,不是否定-30-面向?qū)ο骎S結(jié)構(gòu)化-2(程序)實(shí)現(xiàn)角度數(shù)據(jù)結(jié)構(gòu)+算法=程序設(shè)計(jì)以對(duì)象為中心組織數(shù)據(jù)與操作數(shù)據(jù)對(duì)象屬性操作對(duì)象的行為類型與變量類與對(duì)象實(shí)例函數(shù)(過程)調(diào)用消息傳遞類型與子類型一般類與特殊類,繼承構(gòu)造類型整體-部分結(jié)構(gòu),聚合指針關(guān)聯(lián)-31-面向?qū)ο骎S結(jié)構(gòu)化-3傳統(tǒng)結(jié)構(gòu)化方法面向?qū)ο蠓椒?UML)需求模型輸入I、處理P、輸出O的視角,面向功能的文檔(用戶需求規(guī)格說明書)需求變化,其功能變化,所以系統(tǒng)的基礎(chǔ)不穩(wěn)固從用戶和整體角度出發(fā)使用系統(tǒng)抽象出用例圖、活動(dòng)圖,獲取需求;如需求變化,對(duì)象的性質(zhì)相對(duì)功能穩(wěn)定,系統(tǒng)基礎(chǔ)穩(wěn)定分析模型面向過程的數(shù)據(jù)流圖DFD、實(shí)體—關(guān)系圖ERD、數(shù)據(jù)字典DD表示分析模型功能分解,數(shù)據(jù)和功能/過程分開把問題作為一組相互作用的實(shí)體,顯式表示實(shí)體間的關(guān)系數(shù)據(jù)模型和功能模型一致類、對(duì)象圖表示分析模型,狀態(tài)、順序、通信、活動(dòng)圖細(xì)化說明設(shè)計(jì)模型功能模塊(SC圖),模塊之間的連接/調(diào)用是模塊的附屬形式類和對(duì)象實(shí)現(xiàn),類/對(duì)象的關(guān)聯(lián)、聚集、繼承等連接、連接規(guī)范和約束作為顯式定義實(shí)施模型體系結(jié)構(gòu)設(shè)計(jì)構(gòu)件圖,部署圖測(cè)試模型根據(jù)文檔進(jìn)行單元測(cè)試,集成測(cè)試,確認(rèn)測(cè)試單元測(cè)試采用類圖,集成測(cè)試用實(shí)現(xiàn)圖和交互圖,確認(rèn)測(cè)試采用用例圖-32-內(nèi)容安排從結(jié)構(gòu)化到面向?qū)ο笳n程介紹對(duì)象技術(shù)對(duì)象和類對(duì)象技術(shù)相關(guān)原則上升到面向?qū)ο?33-對(duì)象技術(shù)是一種看待計(jì)算機(jī)軟件系統(tǒng)的觀點(diǎn)是一種系統(tǒng)分析和設(shè)計(jì)的思想是一種編程方法是一組設(shè)計(jì)原則和模式是實(shí)踐者的日常工作是吹鼓手、騙子和市場(chǎng)人員口中的“萬靈丹”-34-對(duì)象技術(shù)對(duì)象技術(shù)是一系列指導(dǎo)軟件構(gòu)造的原則(如抽象、封裝、多態(tài)等)并通過語言、數(shù)據(jù)庫和其它工具來支持這些原則-35-對(duì)象技術(shù)的發(fā)展歷史Simula基本思想19671972Smalltalk實(shí)用化C++

商業(yè)化1980s1995Java

編程方法的成熟UML

統(tǒng)一方法學(xué)19972011+構(gòu)件、

服務(wù)、

云計(jì)算???-36-對(duì)象技術(shù)優(yōu)勢(shì)-1溝通順應(yīng)人類思維習(xí)慣,讓軟件開發(fā)人員在解空間中直接模擬問題空間中的對(duì)象及其行為PUSHEBXMOVEBX,EDXMOVEDX,EAXSHREDX,16DIVBXAHare.Run;ALion.Catch(AHare);ALion.Kill(AHare);AHare.Dead;ALion.Eat;ALion.Happy;在計(jì)算機(jī)中模擬現(xiàn)實(shí)世界的事和物-37-對(duì)象技術(shù)利益-2穩(wěn)定較小的需求變化不會(huì)導(dǎo)致系統(tǒng)結(jié)構(gòu)大的改變當(dāng)需求變化時(shí)……功能:最易變數(shù)據(jù):較易變對(duì)象:較穩(wěn)定穩(wěn)定性增加用較穩(wěn)定把不穩(wěn)定的包起來-38-對(duì)象技術(shù)利益-3復(fù)用代碼重用:類庫、框架等重用機(jī)制能提高質(zhì)量,減少由于編制新的系統(tǒng)代碼而產(chǎn)生的成本通過繼承、關(guān)聯(lián)、封裝等手段軟件開發(fā)組越大,組中每個(gè)成員的生產(chǎn)率就越低--PhilippeKahn,Borland公司創(chuàng)始人構(gòu)造大型軟件不能靠堆人-39-內(nèi)容安排從結(jié)構(gòu)化到面向?qū)ο笳n程介紹對(duì)象技術(shù)對(duì)象和類對(duì)象技術(shù)相關(guān)原則上升到面向?qū)ο?40-對(duì)象(Object)對(duì)象(Object)是一個(gè)實(shí)體、一件事、一個(gè)名詞,可以獲得的某種東西,可以想象有自己標(biāo)識(shí)的任何事物可以是物理存在的也可能是概念中的或軟件中的實(shí)體-41-UML中的對(duì)象命名對(duì)象匿名對(duì)象僅有對(duì)象名的對(duì)象類類一系列對(duì)象的抽象描述,這些對(duì)象共享相同的屬性、操作、關(guān)系和語義一個(gè)具體的對(duì)象是該類的一個(gè)實(shí)例抽象過程強(qiáng)調(diào)相關(guān)特征而忽略其它的特征類抽象的過程就是將具體對(duì)象的特征和行為進(jìn)行參數(shù)化,分別用類的屬性(attribute)和操作(operation)來表示-42--43-屬性屬性(attribute)是類的特征或特性屬性的值是某一特定對(duì)象的屬性值在類中屬性名必須是唯一的每一個(gè)類的實(shí)例都有為這個(gè)類定義的所有屬性的值銀行帳戶類屬性帳號(hào)銀行名稱擁有者金額Mary的銀行帳戶屬性值12345678FirstNationalBankMarySmith$1024.48-44-屬性取決于視點(diǎn)從銷售人員的角度型號(hào)價(jià)格顏色里程數(shù)一輛汽車具有的屬性:從維修人員的角度馬達(dá)類型傳動(dòng)類型維修記錄-45-操作操作(operation)訪問或修改對(duì)象的屬性值對(duì)象的行為是由為此對(duì)象定義的一系列操作決定的一個(gè)類可能同時(shí)存在多個(gè)實(shí)例,也可能在某一時(shí)刻沒有實(shí)例一個(gè)類的所有實(shí)例都可以使用在這個(gè)類中定義的操作從銷售人員的角度處理客戶定單準(zhǔn)備銷售合同加入清單從清單中刪除一輛汽車具有的操作:從維修人員的角度測(cè)試剎車修理剎車轉(zhuǎn)動(dòng)輪胎檢查馬達(dá)速度操作取決于視點(diǎn)-47-UML中的類屬性操作-48-類和對(duì)象的關(guān)系每一個(gè)對(duì)象都是某一個(gè)類的實(shí)例每一個(gè)類在某一時(shí)刻都有零個(gè)或更多的實(shí)體類是靜態(tài)的;它們的存在、語義和關(guān)系在執(zhí)行前就已經(jīng)定義好了對(duì)象是動(dòng)態(tài)的;它們?cè)诔绦驁?zhí)行時(shí)可以被創(chuàng)建和刪除-49-內(nèi)容安排從結(jié)構(gòu)化到面向?qū)ο笳n程介紹對(duì)象技術(shù)對(duì)象和類對(duì)象技術(shù)相關(guān)原則上升到面向?qū)ο?50-對(duì)象技術(shù)相關(guān)原則對(duì)象技術(shù)基本原則抽象(Abstraction)封裝(Encapsulation)泛化(Generalization)多態(tài)(Polymorphism)……-51-抽象和封裝抽象是事物區(qū)別于其它事物的本質(zhì)特征抽象的過程取決于使用者的目的,它應(yīng)該包括使用者所感興趣的那些職責(zé),而忽略掉其它不相關(guān)的部分封裝是指對(duì)象對(duì)其客戶隱藏具體的實(shí)現(xiàn),是軟件模塊化思想的體現(xiàn)通過封裝實(shí)現(xiàn)信息隱藏和數(shù)據(jù)抽象封裝是對(duì)象和類的天然特性,一旦它們被構(gòu)造出來,就意味著具有封裝性。classperson{publicstringname;protectedstringphone;privatefloatsalary;publicperson(){}protectedvoidwork(){}}personp1=newperson();=”張三”;p1.work();面向?qū)ο笙到y(tǒng)的封裝性是一種信息隱藏技術(shù),它使系統(tǒng)設(shè)計(jì)者能夠清楚地標(biāo)明他們所提供的服務(wù)界面,用戶則只看見對(duì)象提供的操作功能,看不到其中的數(shù)據(jù)或操作細(xì)節(jié)。從用戶的角度看,對(duì)象提供了一組服務(wù),而服務(wù)的具體實(shí)現(xiàn)(即對(duì)象的內(nèi)部)卻被屏蔽封裝著。對(duì)象的這一封裝機(jī)制的目的在于將對(duì)象的使用者與設(shè)計(jì)者分開,使用者不必知道對(duì)象行為實(shí)現(xiàn)的細(xì)節(jié),只需用設(shè)計(jì)者提供的協(xié)議命令對(duì)象去做即可。

封裝的作用泛化泛化是類與類之間一種關(guān)系通過這種關(guān)系一個(gè)類可以共享另外一個(gè)或多個(gè)類的結(jié)構(gòu)和行為為了實(shí)現(xiàn)泛化關(guān)系,采用繼承機(jī)制一個(gè)子類(subclass)繼承一個(gè)或多個(gè)父類(superclass),從而實(shí)現(xiàn)了不同的抽象層次通過這種關(guān)系可以很容易地復(fù)用已經(jīng)存在的數(shù)據(jù)和代碼,并實(shí)現(xiàn)多態(tài)處理根據(jù)父類的個(gè)數(shù)不同,存在著單一繼承和多重繼承兩種情況-54-概念繼承所表達(dá)的是一種對(duì)象類之間的相交關(guān)系。它使得某類對(duì)象可以繼承另外一類對(duì)象的特征和能力。若類間具有繼承關(guān)系,則它們之間應(yīng)具有下列幾個(gè)特性:類間具有共享特征類間具有細(xì)微的差別和新增部分類間具有層次結(jié)構(gòu)從繼承內(nèi)容上劃分取代繼承、包含繼承、受限繼承、特化繼承從繼承源上劃分單繼承、多繼承分類示例3.面向?qū)ο蟮幕咎匦詂lassteacher:person{publicstringtitle;publicteacher(){}}classstudent:person{protectedintscore;publicstudent(){}}teachert1=newteacher();=”孔丘”;t1.title=”圣人”;students1=newstudent();=”顏回”;s1.score=”95”;泛化的作用1.能清晰體現(xiàn)相關(guān)類間的層次結(jié)構(gòu)關(guān)系。

2.能減小代碼和數(shù)據(jù)的重復(fù)冗余度,大大增加程序的重用性。

3.能通過增強(qiáng)一致性來減少模塊間的接口和界面,大大增加程序的易維護(hù)性。

4.繼承是自動(dòng)傳播代碼的有力工具。

5.繼承是在一些比較一般的類的基礎(chǔ)上構(gòu)造、建立和擴(kuò)充新類的最有效的手段。多態(tài)多態(tài)在同一外表(接口)下表現(xiàn)出多種行為的能力是對(duì)象技術(shù)的根本特征對(duì)象技術(shù)正是利用多態(tài)提供的動(dòng)態(tài)行為特征,來封裝變化,適應(yīng)變更,以達(dá)到系統(tǒng)的穩(wěn)定-59--60-應(yīng)用多態(tài)性假設(shè)我們有一個(gè)數(shù)組sharr,里面放著一排Shape,但是不知道哪些是Rectangle,哪些是Circle。利用多態(tài)性,我們可以:

for(inti=0;i<sharr.length;++i){ Shapeshape=(Shape)sharr[i]; shape.draw(); }遍歷整個(gè)數(shù)組的過程中,各個(gè)Shape自己知道應(yīng)當(dāng)如何在畫布上繪制自己。shape.draw()這同一行代碼在shape指向不同的對(duì)象時(shí)表現(xiàn)出不同的行為,這就是所謂多態(tài)性多態(tài)性(polymorphism)概念多態(tài)性原意是指一種事物具有多種形態(tài)。在面向?qū)ο蠹夹g(shù)中,指不同的對(duì)象收到同一消息時(shí)產(chǎn)生不同的動(dòng)作。覆蓋(override)是典型的對(duì)多態(tài)的應(yīng)用。重載(overload)不是對(duì)多態(tài)的應(yīng)用。前期綁定與后期綁定前期綁定:在程序運(yùn)行之前進(jìn)行綁定,由編譯器和連接程序?qū)崿F(xiàn),又叫做靜態(tài)綁定后期綁定:在運(yùn)行時(shí)根據(jù)對(duì)象的類型進(jìn)行綁定,由方法調(diào)用機(jī)制實(shí)現(xiàn),因此又叫做動(dòng)態(tài)綁定,或者運(yùn)行時(shí)綁定。除了前期綁定外的所有方法都屬于后期綁定。Bruce

Eckel:“不要犯傻,如果它不是后期綁定,它就不是多態(tài)?!敝剌d重載(overload)是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類型不同)例如:publicvoidtest(intx){}

publicvoidtest(stringx){}

重載的實(shí)現(xiàn)是:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(至少對(duì)于編譯器來說是這樣的)。編譯器做過修飾后的函數(shù)名稱可能是這樣的:int_test、str_test。對(duì)于這兩個(gè)函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)的。也就是說,它們的地址在編譯期就綁定了(前期綁定)。因此,重載只是一種語言特性,與多態(tài)無關(guān),與面向?qū)ο笠矡o關(guān)!覆蓋覆蓋(override)是指在子類中重新定義父類的虛函數(shù)的做法。

真正和多態(tài)相關(guān)的是“覆蓋”。當(dāng)子類重新定義了父類的虛函數(shù)后,父類指針根據(jù)賦給它的不同的子類地址,動(dòng)態(tài)的調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的(調(diào)用的子類的虛函數(shù)的地址無法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(后期綁定)。示例示例Classperson{Publicvirtualvoidwork(){Console.WriteLine("personwork");}}Classteacher:person{Publicoverridevoidwork(){Console.WriteLine("teaching");}}Classstudent:person{Publicoverridevoidwork(){Console.WriteLine("study");}}示例

staticvoidMain(){personp1=newteacher();personp2=newstudent();p1.work();p2.work();}

輸出:teachingstudy多態(tài)的作用多態(tài)性支持“同一接口,多種方法”,消除了類之間的耦合關(guān)系,使程序更容易擴(kuò)展,提高程序設(shè)計(jì)的靈活性。-69-內(nèi)容安排從結(jié)構(gòu)化到面向?qū)ο笳n程介紹對(duì)象技術(shù)對(duì)象和類對(duì)象技術(shù)相關(guān)原則上升到面向?qū)ο?70-實(shí)例1:OO觀點(diǎn)的個(gè)人簡(jiǎn)介tanHuobin是Teacher類的一個(gè)實(shí)例,該實(shí)例是基于beiHangUniversity對(duì)象的softwareSchool成員對(duì)象工作類GraduateStudent的所有實(shí)例都可以通過Course類的對(duì)象ooTechnology建立關(guān)聯(lián),并可發(fā)送phone消息(消息內(nèi)容:82338518-862)或email消息(消息內(nèi)容:)-71-OO個(gè)人簡(jiǎn)介的UML表示-72-實(shí)例2:對(duì)象思維分析問題昨天我的一個(gè)朋友結(jié)婚了-73-問題分析

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論