面向?qū)ο缶幊袒A(chǔ)_第1頁(yè)
面向?qū)ο缶幊袒A(chǔ)_第2頁(yè)
面向?qū)ο缶幊袒A(chǔ)_第3頁(yè)
面向?qū)ο缶幊袒A(chǔ)_第4頁(yè)
面向?qū)ο缶幊袒A(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第5章 面向?qū)ο缶幊袒A(chǔ) 教學(xué)目標(biāo) 面向?qū)ο蟪绦蛟O(shè)計(jì)(Object Oriented Programming,簡(jiǎn)稱OOP)最早是在C+中使用的先進(jìn)程序設(shè)計(jì)方法,它盡可能地模擬人類習(xí)慣的思維方式,使開發(fā)軟件的方法和過程盡可能地接近人類認(rèn)識(shí)世界、解決問題的方法與過程。采用面向?qū)ο蟮某绦蚍治龊驮O(shè)計(jì)技術(shù)開發(fā)的軟件系統(tǒng),穩(wěn)定性、可重用性和可維護(hù)性都很好。本書前面介紹了C#語(yǔ)法和編程的所有基礎(chǔ)知識(shí)。但是,要了解C#語(yǔ)言和.NET Framework的強(qiáng)大功能,還需要使用OOP技術(shù)。本章首先介紹OOP的基礎(chǔ)知識(shí),進(jìn)而引導(dǎo)讀者踏入面向?qū)ο蟪绦蛟O(shè)計(jì)的殿堂教學(xué)重點(diǎn)面向?qū)ο缶幊探涌谂c繼承多態(tài)性運(yùn)算符重載引用類型和值

2、類型面向?qū)ο蟾攀?面向?qū)ο缶幊淌莿?chuàng)建計(jì)算機(jī)應(yīng)用程序的一種較新的方法,它解決了所謂的傳統(tǒng)編程技巧帶來的問題。 在客觀世界中,可以把具有相似特征的事物歸為一類,也就是把具有相同屬性的對(duì)象看成一個(gè)類(class)。比如,所有的汽車可以歸成一個(gè)“汽車類”,所有的人可以歸成一個(gè)“人類”。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,“類”就是對(duì)具有相同屬性和相同操作的一組對(duì)象的定義。從另一個(gè)角度來看,對(duì)象就是類的一個(gè)實(shí)例。 OOP相關(guān)的概念 類和對(duì)象靜態(tài)成員對(duì)象的生命周期繼承接口多態(tài)性對(duì)象之間的關(guān)系運(yùn)算符重載引用類型和值類型類和對(duì)象(1)類是面向?qū)ο蟪绦蛟O(shè)計(jì)的基本構(gòu)成模塊。從定義來講,類是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)可能包含數(shù)

3、據(jù)程序、函數(shù)成員以及其它的嵌套類型。數(shù)據(jù)成員類型有常量、域和事件;函數(shù)成員類型有方法、屬性、索引指示器、操作符、構(gòu)造函數(shù)和析構(gòu)函數(shù) 對(duì)象是從類型中創(chuàng)建的,就像前面的變量一樣。對(duì)象的類型在OOP中有一個(gè)特殊的名稱:類 對(duì)象是OOP應(yīng)用程序的一個(gè)組成部件。這個(gè)組成部件封裝了部分應(yīng)用程序,這部分程序可以是一個(gè)過程、一些數(shù)據(jù)或一些更抽象的實(shí)體 類和對(duì)象(2)字段是一個(gè)代表和某對(duì)象或類相關(guān)的變量的成員屬性是提供對(duì)對(duì)象或類的特性進(jìn)行訪問的成員方法是一個(gè)執(zhí)行可以由對(duì)象或類完成的計(jì)算或行為的成員 事件是使得對(duì)像和類提供通知的成員 靜態(tài)成員 靜態(tài)成員可以在類的實(shí)例之間共享,所以可以將它們看作是類的全局對(duì)象。靜態(tài)

4、屬性和靜態(tài)字段可以訪問獨(dú)立于任何對(duì)象實(shí)例的數(shù)據(jù),靜態(tài)方法可以執(zhí)行與對(duì)象類型相關(guān)、但與對(duì)象實(shí)例無關(guān)的命令。在使用靜態(tài)成員時(shí),甚至不需要實(shí)例化對(duì)象 對(duì)象的生命周期 每個(gè)對(duì)象都一個(gè)明確定義的生命周期,除了“正在使用”的正常狀態(tài)之外,還有兩個(gè)重要的階段:構(gòu)造階段:對(duì)象最初被創(chuàng)建并實(shí)例化的時(shí)期。這個(gè)初始化過程稱為構(gòu)造階段,由構(gòu)造函數(shù)來完成。析構(gòu)階段:在刪除一個(gè)對(duì)象時(shí),常常需要執(zhí)行一些清理工作,釋放對(duì)象占有的資源,這由析構(gòu)函數(shù)來完成。繼承 繼承是OOP最重要的特性之一。任何類都可以從另一個(gè)類中繼承,被繼承(也稱為派生)的類稱為父類(也稱為基類),派生出的類成為子類,子類擁有父類的所有成員 繼承是傳遞的。如

5、果C從B派生,并且B從A派生,那么C繼承在B中聲明的成員同時(shí)也繼承在A中聲明的成員。一個(gè)派生類擴(kuò)展它的直接基類。一個(gè)派生類可以添加同它繼承的成員一樣的新成員,但是不能去掉一個(gè)繼承的成員的定義。構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承。一個(gè)派生類可以通過用相同的名稱或聲明一個(gè)新的成員的方法隱藏繼承的成員。一個(gè)類的實(shí)例包含在類和它的基類中聲明的所有實(shí)例域的備份,并且存在一個(gè)從繼承類類型到任何基類類型的隱式轉(zhuǎn)換。一個(gè)類可以聲明虛擬方法、屬性和索引,并且派生類可以覆蓋這些功能成員的執(zhí)行。這使得類可以展示多態(tài)行為,此行為被功能成員調(diào)用實(shí)現(xiàn),而這個(gè)調(diào)用要根據(jù)實(shí)例的運(yùn)行時(shí)類型,通過這個(gè)類型,方法成員被調(diào)用。接口 接口就

6、是把隱式公共方法和屬性組合起來,以封裝特定功能的一個(gè)集合。一個(gè)接口定義了一個(gè)協(xié)議。一個(gè)實(shí)現(xiàn)了接口的類或結(jié)構(gòu)必須符合它的協(xié)議。一個(gè)接口可以從多個(gè)基本接口繼承,而一個(gè)類或結(jié)構(gòu)也可以實(shí)現(xiàn)多個(gè)接口。 C# 中一個(gè)比較特殊的接口是IDisposable,支持IDisposable接口的對(duì)象必須實(shí)現(xiàn)其Dispose()方法,該方法的主要作用是,當(dāng)不再需要某個(gè)對(duì)象時(shí),就調(diào)用這個(gè)方法,釋放重要的資源,否則,該資源會(huì)等到對(duì)垃圾回收調(diào)用析構(gòu)函數(shù)時(shí)才釋放 多態(tài)性 繼承的一個(gè)結(jié)果是使得派生類在方法和屬性上有一定的重疊,因此,可以使用相同的語(yǔ)法處理從同一個(gè)基類實(shí)例化的對(duì)象。而多態(tài)性則更推進(jìn)了一步,它可以把某個(gè)派生類型的

7、變量賦值給其基類類型的變量接口也可以使用多態(tài)性,盡管不能像對(duì)象那樣實(shí)例化接口,但可以建立接口類型的變量,然后就可以在支持該接口的對(duì)象上,使用這個(gè)變量訪問該接口提供的方法和屬性 對(duì)象之間的關(guān)系 包含關(guān)系:一個(gè)類包含另一個(gè)類。這類似于繼承關(guān)系,但包含類可以控制對(duì)被包含類的成員的訪問,甚至在使用被包含類的成員前進(jìn)行其他處理。集合關(guān)系:一個(gè)類用作另一個(gè)類的多個(gè)實(shí)例的容器。這類似于對(duì)象數(shù)組,但集合有其他功能,包括索引、排序、重新設(shè)置大小等。 運(yùn)算符重載 運(yùn)算符重載是指通過函數(shù)重載使得我們可以對(duì)類的對(duì)象實(shí)例使用標(biāo)準(zhǔn)的運(yùn)算符 運(yùn)算符重載非常有用,因?yàn)槲覀兛梢栽谶\(yùn)算符重載中執(zhí)行需要的任何操作。要重載運(yùn)算符,需

8、要給類添加運(yùn)算符類型成員(它們必須是static)。一些運(yùn)算符有多種用途,(例如運(yùn)算符就有一元和二元兩種功能),因此我們還指定了要處理多少個(gè)操作數(shù),以及這些操作數(shù)的類型 引用類型和值類型 值類型變量在內(nèi)存的棧中存儲(chǔ)它們自己和它們的內(nèi)容。引用類型變量在內(nèi)存的堆中存儲(chǔ)一個(gè)引用,而在另一個(gè)地方存儲(chǔ)內(nèi)容。實(shí)際上,在使用C#時(shí),不必過多地考慮這個(gè)問題。因?yàn)樵谑褂脮r(shí),值類型變量和引用類型變量的使用方式基本上完全相同。值類型和引用類型的一個(gè)主要區(qū)別是,值類型總是包含一個(gè)值,而引用類型可以是null,表示它們不包含值。但是,可以使用可空類型(這是泛型的一種形式)創(chuàng)建一個(gè)值類型,使值類型在這個(gè)方面的行為方式類似

9、于引用類型(即可以為null)。VS 2005中的OOP工具 “類視圖”窗口除了可以查看類的結(jié)構(gòu)信息之外,還可以訪問許多項(xiàng)的相關(guān)代碼 對(duì)象瀏覽器該窗口顯示了與“類視圖”窗口相同的信息,另外還顯示了.NET類型的其他信息 添加新類選擇“項(xiàng)目”|“添加類”菜單命令 生成UML類圖 在主窗口中選擇Program.cs文件,然后單擊“解決方案資源管理器”工具欄中的“查看類關(guān)系圖”按鈕 定義C#類 類的聲明抽象類密封類類基礎(chǔ)規(guī)范基類接口列表類主體類的聲明(1)類聲明的組成如下:一系列可選的屬性,跟著一系列可選的類修飾符,關(guān)鍵詞class和一個(gè)作為類名的標(biāo)識(shí)符,跟著一個(gè)可選的類的基本說明,然后是一對(duì)定義的

10、類的主體,還可以跟一個(gè)可選的分號(hào) 修 飾 符含 義無或internal類只能在當(dāng)前項(xiàng)目中訪問public類可以在任何地方訪問abstract 或internal abstract類只能在當(dāng)前項(xiàng)目中訪問,不能實(shí)例化,只能繼承public abstract類可以在任何地方訪問,不能實(shí)例化,只能繼承sealed或internal sealed類只能在當(dāng)前項(xiàng)目中訪問,不能派生,只能實(shí)例化public sealed類可以在任何地方訪問,不能派生,只能實(shí)例化new只允許出現(xiàn)在嵌套類中,指定了一個(gè)類通過相同的名稱隱藏了一個(gè)繼承的成員類的聲明(2)修飾符abstract用來聲明類為抽象類,抽象類不能被實(shí)例化,

11、而只能派生新類。抽象類與非抽象類相比有如下不同點(diǎn):抽象類不能被實(shí)例化,在一個(gè)抽象類上使用new操作符是錯(cuò)誤的。當(dāng)然可以有編譯時(shí)類型為抽象的變量和數(shù)值,這樣的變量和數(shù)值必須或者為null或者包含對(duì)從抽象類型派生的非抽象類的實(shí)例的引用。抽象類可以(但是不需要)包含抽象成員。抽象類不能是密封的。sealed修飾符用來聲明一個(gè)密封類,一旦在類的聲明時(shí)使用了sealed修飾符,就不能從這個(gè)類派生新類了。封裝類不能是任何抽象類,sealed修飾符主要用于防止非計(jì)劃的派生,但是它也使得某些運(yùn)行時(shí)的優(yōu)化成為可能。 類基礎(chǔ)規(guī)范 類基礎(chǔ)規(guī)范是指在類聲明時(shí),可能會(huì)定義了類的直接基本類和由類實(shí)現(xiàn)的接口。它跟在類名后面

12、,由冒號(hào)和基類名和(或)接口列表組成,一個(gè)類的直接基類只能有一個(gè),但可以實(shí)現(xiàn)多個(gè)接口,可以同時(shí)有基類和接口列表,基類名和接口名之間用逗號(hào)分隔 如果類基礎(chǔ)規(guī)范包括一個(gè)接口類型的列表,那么,就稱該類實(shí)現(xiàn)了給定的接口類型。如果指定了基類,則基類必須緊跟在冒號(hào)的后面,之后才是接口列表 類主體 類的主體定義了類的成員,并用一對(duì)括起來。類的成員可以分為下面的幾種:構(gòu)造函數(shù):又可分為實(shí)例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),前者執(zhí)行需要對(duì)類的實(shí)例進(jìn)行初始化的動(dòng)作;后者則執(zhí)行對(duì)類本身進(jìn)行初始化的動(dòng)作。析構(gòu)函數(shù):執(zhí)行在類的實(shí)例要被永遠(yuǎn)丟棄前要實(shí)現(xiàn)的動(dòng)作,釋放對(duì)象占用的資源。字段:包括與類相關(guān)的常數(shù)數(shù)據(jù)和變量。方法:實(shí)現(xiàn)了可以

13、被類實(shí)現(xiàn)的計(jì)算和行為。屬性:定義了命名的屬性和與對(duì)這個(gè)屬性進(jìn)行讀寫的相關(guān)行為。事件:定義了由類產(chǎn)生的公告。索引:它允許類的實(shí)例通過與數(shù)組相同的方法來索引。操作符:它定義了可以被應(yīng)用于類的實(shí)例上的表達(dá)式操作符。類型:它代表位于類中的類型。類成員 類成員聲明必須遵循下面的規(guī)則:構(gòu)造函數(shù)和析構(gòu)函數(shù)必須與類名相同,所有其他的成員必須與類名不同。字段、事件或類型的名稱必須在類聲明中是唯一的,即不能與其他成員的名稱相同。方法的名稱必須與同一個(gè)類中聲明的其他非方法的名稱不同。索引的簽名必須與同一個(gè)類中聲明的所有其他索引的名稱不同。操作符的簽名必須與同一個(gè)類中聲明的所有其他操作符的簽名不同。構(gòu)造函數(shù)和析構(gòu)函數(shù)

14、 如果一個(gè)類不包含任何構(gòu)造函數(shù)聲明,就會(huì)自動(dòng)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)。默認(rèn)的構(gòu)造函數(shù)通常是下面的形式public MyClass(): base() 這里MyClass是類的名稱。默認(rèn)構(gòu)造函數(shù)通過base()完全調(diào)用直接基類的無參數(shù)構(gòu)造函數(shù)。 構(gòu)造函數(shù)的執(zhí)行順序?yàn)榱藢?shí)例化派生的類,必須實(shí)例化它的基類。而要實(shí)例化它的基類,又必須實(shí)例化這個(gè)基類的基類,這樣一直到實(shí)例化System.Object為止。結(jié)果是無論使用什么構(gòu)造函數(shù)實(shí)例化類,總是要先調(diào)用System.Object.Object()。構(gòu)造函數(shù)也可以帶有訪問關(guān)鍵字,前面定義的構(gòu)造函數(shù)都是公有的,但是private和protected的構(gòu)造函數(shù)也

15、有各自的作用 類的析構(gòu)函數(shù)由帶有前綴的類名(與構(gòu)造函數(shù)的相同)來聲明。當(dāng)進(jìn)行垃圾回收時(shí),就執(zhí)行析構(gòu)函數(shù)中的代碼,釋放資源 類可以有一個(gè)靜態(tài)構(gòu)造函數(shù),它只能被運(yùn)行時(shí)代碼所使用,而且不能帶有訪問修飾符 定義字段 字段的聲明可能包括屬性集合、一個(gè)new修飾符、4個(gè)訪問修飾符的有效組合、一個(gè)靜態(tài)修飾符和一個(gè)readonly修飾符等。字段聲明的類型指定了被聲明引入的成員的類型。這個(gè)類型后面跟著一個(gè)變量聲明符列表,其中的每一個(gè)變量聲明符將引入一個(gè)新成員。變量聲明符又包括一個(gè)為成員命名的標(biāo)識(shí)符和一個(gè)可選的“=”符號(hào)和一個(gè)給出變量的初始數(shù)值的變量初始化程序靜態(tài)字段可以通過定義它們的類來訪問 可以使用關(guān)鍵字co

16、nst來創(chuàng)建一個(gè)常量 定義方法 方法聲明可以包含一系列屬性,一個(gè)new修飾符,4個(gè)訪問修飾符的一種有效組合,static、virtual、override或abstract修飾符中的一個(gè),和一個(gè)extern修飾符。方法聲明的返回類型指定了該方法計(jì)算并返回的數(shù)據(jù)的類型。如果方法不返回任何數(shù)值,那么返回類型就是void 對(duì)于抽象和外部的方法,方法主體簡(jiǎn)單地由分號(hào)組成。對(duì)于其他方法,方法主體由指定在方法被調(diào)用時(shí)執(zhí)行的語(yǔ)句組成 定義屬性 屬性的聲明方式與字段類似,但包含的內(nèi)容更多,因?yàn)樗鼈冊(cè)谛薷闹斑€要執(zhí)行一些額外的操作。屬性聲明可以包含一個(gè)new 修飾符,四個(gè)訪問修飾符的有效組合和static、 v

17、irtual、override或abstract修飾符中的一個(gè) 屬性擁有兩個(gè)類似于函數(shù)的塊:一個(gè)塊用于獲取屬性的值;另一個(gè)塊用于設(shè)置屬性的值。這兩個(gè)塊也稱為訪問器,分別用get和set關(guān)鍵字來定義,可以用于控制對(duì)屬性的訪問級(jí)別 使用類圖添加成員 選擇“視圖”|“其他窗口”|“類詳細(xì)信息”菜單命令,打開“類詳細(xì)信息”窗口在“類詳細(xì)信息”窗口中的文本框中輸入方法名稱,就可以把一個(gè)方法添加到當(dāng)前類中。然后就可以依次設(shè)置方法的返回值類型、方法的可訪問性、摘要信息、是否在類圖中隱藏等。添加屬性的方式與添加方法類似 添加字段的方式很簡(jiǎn)單,只需輸入字段的名稱,選擇類型和訪問修飾符即可。 本 章 小 結(jié) 本章介紹了面向?qū)ο缶幊痰幕A(chǔ)知識(shí)。包括面向?qū)ο缶幊痰乃枷?,OOP相關(guān)的概念,對(duì)象聲明周期等,最后又介紹了VS 2005中的OOP工具,利用這些工具可以快速完成很多工作,而無須編寫大量的代碼。通過本章的學(xué)習(xí),使讀者對(duì)OOP有一定的理解和認(rèn)識(shí),并能自己編寫簡(jiǎn)單的C# 類,為深入

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論