面向對象分析與設計ppt課件_第1頁
面向對象分析與設計ppt課件_第2頁
面向對象分析與設計ppt課件_第3頁
面向對象分析與設計ppt課件_第4頁
面向對象分析與設計ppt課件_第5頁
已閱讀5頁,還剩42頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1;.2基于基于UMLUML描述的應用框架模型描述的應用框架模型3一、框架概述4一、框架概述5一、框架概述6一、框架概述7 應用框架應用框架 類庫類庫 目的: 讓應用程序員派生出具 目的: 讓程序員拿現成類來產生對象, 類并 體類 ,派生時可修正類, 才創 未預留空間給程序員來修正。 建對象。 應用框架中的類的方法,常 應用程序的方法只能調用類庫中的方法,調用應用程序中的方法。 反之不可。含有類間的關系,其預設了 類是獨立的,并未設定對象間的通信方式。對象間的互助合作關系。 對象常含預設計行為,預設行 對象的行為都是固定的,無法修正。為可讓應用程序員修正。 一、框架概述8基于基于UMLUML描

2、述的應用框架模型描述的應用框架模型9ControllerModel(Document)View二、應用框架應用(Model-View-ControllerFrameWork)10MicrosoftFoundationClasses(MFC)FrameWorkCObjectCCommandTargetCWinAppCDocTemplateCWndCDocumentCFrameWndCViewCDialogCYourAppCYourFrameCYourViewCYourDlgCYourDocMFCFrame Work LayerApplication Layer11二、應用框架的應用由于框架能大量

3、地重復使用,并可不斷修正它,因而提升了應用程序的彈性,也能提升系統程序的彈性。例如,在SOA系統上,彈性是極重要的。這種低層次的框架已成為熱門話題。在框架技術方面,設計模式(Pattren) 理論(下一節重點介紹)逐漸應用到框架上,值得您密切注意。 目前的框架大多使用于非面向對象操作系統上,如OWL 及MFC都是。它們將非面向對象的Windows 包裝起來,加上一層面向對象的外殼 ,讓應用程序易于跟Windows 通信。 面向對象的操作系統本身就是可修正、有彈性的,而不是像Windows 、DOS 是固定的。這種操作系統提供了支持性的框架,讓人們不但能使用操作系統的API 函數,也可以修正之,

4、使它符合客戶的需要。這種支持性的框架,其觀念與一般應用框架相同,只是它負責系統層次的任務,如計算機網絡、分布式數據庫的管理工作。一般,應用程序員并不直接修正支持性框架,而是由系統維護人員來修正它。12二、應用框架的應用13基于基于UMLUML描述的應用框架模型描述的應用框架模型14多態性多態性面向對象技術的重要一個特點是:大幅提升軟件的彈性和重復使用性。多態性是實現這特點的關鍵技術,尤其在應用框架、分布式對象等環境里,其角色是極為重要的。多態性作為面向對象基本概念,也是面向對象語言必備的要素,若缺乏多態性,則該計算機語言,就不能稱得上面向對象語言了。從我們周圍的生活實例去觀察,會較容易了解多態

5、概念。 三、應用框架的特點15反向調用反向調用我們知道抽象類是框架技術的主角,應用框架中一個重要的令人著迷的地方是:框架里的函數能調用應用程序的函數,這是框架與一般類庫(或鏈接庫)的極重要區別。使用一般鏈接庫時,程序中的函數調用了現成的庫函數,但庫函數不能反過來,調用您所寫的函數。由于庫函數設計在先,而您寫程序在后;所以,您的函數調用庫存函數,這種晚輩調用前輩的傳統通信情形,我們已經非常熟悉。應用框架除了能進行傳統通信外,還提供新方法:前輩調用晚輩。雖然前輩(應用框架)創建時,晚輩(應用程序)尚未創建;但是前輩有時候可預知晚輩中的函數,就可調用它。這種功能,具有下述效果:框架能事先定義許多預設

6、(Default)函數。應用程序員的主要工作是:設計函數供框架來調用。這些函數可修正或取代框架中的函數。如果程序中的函數已修正或取代預設函數,框架就調用程序中的函數;反之則調用預設函數。 三、應用框架的特點16三、應用框架的特點17抽象類抽象類抽象一詞常令人覺得那是難以體會的事。在應用框架上,如果您把抽象定義為抽出共同的特征,那就比較容易理解了。抽象類是面向對象中重要的概念,用途非常廣,這一節我們主要使用C+語言來描述一些概念。怎樣得到抽象類,比如,觀察兩個相似的類,并分辨其相同與相異點,然后把相同點抽離出來,構成父類,就是抽象類了。由于這過程很簡單,就廣義上而言,都要經過下述過程:Step1

7、.觀察幾個相似的類。Step2.分辨它們的異同點。Step3.把它們的相同點抽離出來。而導出的父類都稱為抽象類。然而軟件中,對抽象類采取較嚴格的定義。其定義為:如如果在類中,有些函數是不完整的,就稱為抽象類。果在類中,有些函數是不完整的,就稱為抽象類。反之,如果類中的函數,都是完整的,就稱為具體類。所謂不完整,就是函數的內容從缺,例如:classPersonpublic:virtualvoidDisplay()=0;Display()=0指令的“=0”符號,表示此為純粹虛擬函數。這種函數內的指令從缺,等待子類來補充。因此,C+有個更明確的定義:凡類中含有純粹虛擬函數,凡類中含有純粹虛擬函數,就

8、是抽象類。就是抽象類。18抽象類抽象類也得注意:子類并不見得是具體類,例如:classPersonpublic:virtualvoidDisplay()=0;classEmployee:publicPerson.public:.;這Employee是個子類,但它未將Display()函數充實完整,仍是個抽象類。三、應用框架的特點19例如,#includeclassPersonprotected:charname20;public:voidSetName(char*na)strcpy(name,na);virtualvoidDisplay()=0;classCustomer:publicPers

9、onpublic:virtualvoidDisplay()coutCustomer:nameendl;三、應用框架的特點20Customer類將Display()函數補充完整了,Customer成為具體類。這Display()函數仍是虛擬函數,但已不是純粹虛擬函數了。由于抽象類的某些函數并不完整,若此類創建其對象,則該對象無法表達出某些行為,所以C+禁止其創建對象,這是抽象類與具體類的重要區別。抽象類的目的供具體類來繼承它,但不用來創建對象。具體類之目的創建對象。抽象類不能用于創建對象,應注意下述限制: 不能做為數據成員的類型不能做為數據成員的類型。例如,#includeclassCompan

10、yPersonpresident;public:;voidmain()Companyc;president是Company類的數據成員,當Company類派生其對象時,也得派生president對象,這是C+所不允許的。三、應用框架的特點21不能做為自變量的類型不能做為自變量的類型。例如,#includevoiddisp(Personp)p.SetName(Tom);voidmain()Personx;disp(x);這含有兩個錯誤:指令Person無法派生自動對象x。自變量pPerson欲派生p對象;但自變量也是自動對象,C+并不允許。如果Person為具體類就對了。三、應用框架的特點22不

11、可做為函數的類型不可做為函數的類型 。例如,PersonSub(Personp)returnp;Sub()函數將傳回p對象的內容,此時必需派生暫時的Person對象來接受return傳來的對象內容。但Person無法派生暫時對象,所以錯了。若改為:CustomerSub(Customerc)returnc;就可以了。三、應用框架的特點23不能用來轉換對象的類型不能用來轉換對象的類型。例如,#includevoidmain()Customercust;cust.SetName(Linda);(Person)cust).SetName(Jacky);(Person)cust指令將派生Person的

12、臨時對象,再將cust對象值轉換并存入該臨時對象中,但Person無法產生該臨時對象,所以錯了。三、應用框架的特點24抽象類正確的使用如下幾條:抽象類正確的使用如下幾條:使用抽象類指針來指向子類的對象使用抽象類指針來指向子類的對象。例如,#include#includeex04-01.h/引用類Person和Customervoidmain()Customercust;cust.SetName(Linda);Person*p=&cust;p-Display();此程序聲明了抽象類的指針p,并令p指向子類的對象cust。所以,執行時輸出:Customer:Linda。三、應用框架的特點2

13、5指針可以當做函數的自變量指針可以當做函數的自變量 。例如,#include#includeex04-01.h/classPersonandCustomervoidSet(Person*p)p-SetName(Amy);voidmain()Customercust;cust.SetName(Linda);Set(&cust);cust.Display();此時p指向cust對象,是正確的。此程序輸出:Customer:Amy。三、應用框架的特點26函數可以回傳抽象類的指針函數可以回傳抽象類的指針 。例如,#include/classPersonandCustomerPerson*sub

14、()Customer*pc=newCustomer();pc-SetName(Tom);return(Person*)pc;voidmain()sub()-Display();deletesub();此程序輸出:Customer:Tom。return指令將pc值轉為Person*類型的指針,然后傳回來,于是sub()值為Person類的指針,正指向new所產生的對象。三、應用框架的特點27基于基于UMLUML描述的應用框架模型描述的應用框架模型28能聲明抽象類的引用能聲明抽象類的引用(Reference)。由于引用與指針是一體的兩面,引用的本質是指針,所以C+允許:聲明抽象類的引用。抽象類的引

15、用可以做為函數的自變量。函數可以傳回抽象類的引用值。#include/classPersonandCustomerPerson&sub(Person&x)x.SetName(John);returnx;voidmain()Customercust;sub(cust).Display();此程序輸出:Customer:John。其中,sub()xcust。所以sub(cust).Display()指令相當于cust.Display()。四、應用框架的特點29雙向通信(正向通信)雙向通信(正向通信)傳統的鏈接庫(FunctionLibrary)及類庫(ClassLibrary)只提

16、供單向通信,而應用框架則提供雙向通信。應用框架也提供了正向通信方法。例如,假設前面所談過的Person及Customer兩類已存于應用框架中,則可寫程序如下:classVIP:publicCustomerchartel15;public:VIP(char*na,char*t)SetName(na);strcpy(tel,t);virtualvoidDisplay()Customer:Display();coutTEL:telendl;voidmain()VIPv(“Zhengwei,“);v.Display();執行時輸出:Customer:ZhengweiTEL:四、應用框架的設計方法30雙

17、向通信(反向通信)雙向通信(反向通信)前輩調用晚輩。這種情形稱為反向通信。例如,假設框架中增加了Product服務類如下: classProductprotected:intpno;Customer*pc;public:Product(intno)pno=no;voidSoldTo(Customer&c)pc=&c;voidInquire()Print();coutsoldto.Display();virtualvoidPrint()=0;四、應用框架的設計方法31VIP程序如下:程序如下:#include/classPersonandCustomerclassProductc

18、lassVIP:publicCustomerchartel15;public:VIP(char*na,char*t)SetName(na);strcpy(tel,t);virtualvoidDisplay()Customer:Display();coutTEL:telendl;classTV:publicProductdoubleprice;public:TV(intno,doublepr):Product(no)price=pr;virtualvoidPrint()coutTVNo:pnoendl;coutPrice:priceendl;voidmain()/客戶程序客戶程序TVt(1100

19、,1800.5);VIPvp(“Dthree,);t.SoldTo(vp);t.Inquire();32結果結果執行時輸出:TVNo:1100Price:1800.5soldto.Customer:DthreeTEL:這程序展現了應用框架的現象: 程序執行時,主控權在框架手上。雖然main()函數仍為程序的啟動者,但主要的處理過程都擺在Product類內。例如,SoldTo()負責搭配產品與顧客之間的關系。Inquire()負責調用TV的Print()輸出產品數據,并調用VIP的Display()輸出顧客數據。 程序里的類,其成員函數,主要是供框架調用。例如,TV類的Print()供Inqui

20、re()調用,而VIP類的Display()供Inquire()調用。 由于框架掌握主控權,復雜的指令都擺在框架中,其大幅簡化了應用程序。因此,優良的應用框架常讓程序員如虎添翼。 框架里的Inquire()進行反向通信,它調用子類的Print()函數。這是同體系內的反向調用。 框架里的Inquire()反向調用VIP的Display()函數。因Product與VIP分屬不同的類體系。這是跨越體系的反向通信。四、應用框架的設計方法33分析分析這兩種反向調用,都是依賴幕后助手虛擬函數,才能實現。由于TV的Print()及VIP類的Display()都是虛擬函數,所以框架中的Inquire()能調用

21、它們。請看上述第1種反向調用吧:Product父類設計在先,然后才派生TV子類,且由不同人所設計。為什么Product的Inquire()能調用TV的Print()函數呢?萬一TV類并無Print()時,怎么辦呢?答案很簡單:TV必須定義Print()函數,才能成為具體類。TV成為具體類,才能派生對象。有了對象才能調用Inquire()函數。既然TV已有Print()函數,當然Inquire()能調用它。現在已確定TV中必有個Print()函數了。但另一個問題是:為什么Print()必須是虛擬函數呢?若將之聲明為一般函數,難道不行嗎?答案是:TV的對象調用Inquire()函數。Print()

22、必須是虛擬函數虛擬函數,才能確保Inquire()會反向調用到該對象的Print(),亦即調用到TV類的Print()。四、應用框架的設計方法34假如將Print()聲明為一般函數,則Inquire()會調用到Product類的Print()。例如,#includeclassProductintpno;public:Product(intno)pno=no;voidInquire()Print();voidPrint()coutThisisProduct:Print()n;classTV:publicProductdoubleprice;public:TV(intno,doublepr):Pr

23、oduct(no)price=pr;voidPrint()coutInquire();四、應用框架的設計方法36抽象類與具體類結合雖然應用框架中的主角是抽象類,但也常含有具體類,如上述的Customer類就是。此外,也常含有公用函數,如上述DoInquire()就是。甚至,必要時您可拿框架中的具體類(如Customer)來派生對象,并擺在框架中,成為公用對象,供程序來使用之。于是,可由這框架派生出子類,如下:四、應用框架的設計方法37基于基于UMLUML描述的應用框架模型描述的應用框架模型38MFC:本節將說明MFC框架的核心類體系,并分析其預設函數及反向溝通。MFC框架的核心類體系為:五、實

24、戰錦囊39CWinApp為具體類,可直接拿來派生對象如下:#includeCWinAppApp;App是CWinApp的對象,這對象派生時,框架中有個指針appCurrentWinApp會指向它。五、實戰錦囊您可通過框架中的公用函數AfxGetApp()來取得該指針值。例如指令AfxGetApp()-Run(),就調用了App對象的Run()函數。也許您會覺得奇怪:上述程序好像缺少了main()函數,是不?答案是:框架中已經預設了WinMain() 函數。請看這WinMain() 的內容40WinMain() . AfxGetApp()-InitInstance(); . AfxGetApp(

25、)-Run(); 程序指令AfxGetApp()-InitInstance();相當于: App.InitInstance();也就是調用了CWinApp 類的InitInstance()函數。這 InitInstance() 是框架中的預設函數,其內容為: InitInstance() return TRUE; 這預設函數并未做什么事,但它是虛擬函數,您可定義新函數來取而代。接著,程序指令AfxGetApp()-Run(); 相當于: App.Run();這 Run()是框架中的預設虛擬函數,其內容為: Run() . for(; ;) . if( !PumpMessage() ) brea

26、k; 五、實戰錦囊41由此可知,框架和應用程序的調用關系圖示如下:五、實戰錦囊請看看Run() 的內容。其中有個 for(; ;) 循環,它負責接待Windows 傳來的消息,并將消息轉送CFrameWnd 的對象。但是上述程序中,并未派生CFrameWnd 的對象,就無法轉送消息了,屏幕上也看不到窗口。那該怎么辦呢?答案是:定義新的InitInstance()函數來取代預設函數。于是,派生子類如下: 42五、實戰錦囊現用C+ 表達如下:#include class YWindow : public CframeWnd public: YWindow() Create( NULL, YWin

27、); ; 43五、實戰錦囊class YApp : public CWinApp virtual BOOL InitInstance() m_pMainWnd = new YWindow; m_pMainWnd-ShowWindow( m_nCmdShow ); return 1; ;YApp App; /end 44五、實戰錦囊于是,由程序指令 m_pMainWnd = new YWindow 建立如下關系: 以上是舉CWinApp的InitInstance()為例,說明預設函數與反向調用。現在,換個角度看看CFrameWnd類。它也含很多預設函數,有的是它自己定義的,有的是從CWnd繼承而來的。例如,CWnd類含有OnPaint()預設函數,而您可定義新OnPaint()來取代預設函數。如下述程序:45五、實戰錦囊#include class YWindow : p

溫馨提示

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

評論

0/150

提交評論