第3章 類和結(jié)構(gòu)_第1頁
第3章 類和結(jié)構(gòu)_第2頁
第3章 類和結(jié)構(gòu)_第3頁
第3章 類和結(jié)構(gòu)_第4頁
第3章 類和結(jié)構(gòu)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教育部普通高等教育十二五國家級規(guī)劃教材

《C#程序設(shè)計及應(yīng)用教程》第3版

(包括簡化版:《C#程序設(shè)計教程》第3版)

第3章類和結(jié)構(gòu)2Ch3類和結(jié)構(gòu)3.1自定義類(class)和結(jié)構(gòu)(struct)3.2屬性和方法3.3類的繼承與多態(tài)性3.4常用結(jié)構(gòu)和類的用法(課后自學(xué))

3.1自定義類(class)和結(jié)構(gòu)(struct)

3.1.1類的定義和成員組織3.1.2訪問修飾符3.1.3靜態(tài)成員和實例成員3.1.4構(gòu)造函數(shù)和析構(gòu)函數(shù)3.1.5字段和局部變量3.1.6結(jié)構(gòu)的定義和成員組織343.1.1類的定義和成員組織類:定義對象具有的特征(字段、屬性等)和可執(zhí)行的操作(方法、事件等)。例如:某單位的員工是一個類,則該單位的張三、李四和王五等都是對象(員工的實例).

自定義類的常用形式:

[訪問修飾符][static]class類名[:基類[,接口序列]]{[類成員]}類成員:包括字段、屬性、構(gòu)造函數(shù)、方法、事件、運算符、索引器、析構(gòu)函數(shù)等。53.1.2訪問修飾符類和類的成員都可以使用下面的訪問修飾符。public:類的內(nèi)部和外部代碼都可以訪問。private:類的內(nèi)部可訪問,類的外部無法訪問。如果省略類成員的訪問修飾符,默認為private。(Java語言默認為protected)internal:同一個程序集中的代碼都可以訪問,程序集外的其他代碼無法訪問。如果省略類的訪問修飾符,默認為internal。(Java中無此關(guān)鍵字)protected:類的內(nèi)部或者從該類繼承的子類可以訪問。protectedinternal:從該類繼承的子類或者從另一個程序集中繼承的類都可以訪問。請大家看書P69頁下方Person類的例子6partial修飾符:包含partial修飾符的類稱為分部類??蓪㈩惖亩x分布在多個文件中,編譯器編譯帶有partial修飾符的類時,會自動將這些文件合并在一起??筛綦x自動生成的代碼和人工書寫的代碼。(在Win窗體應(yīng)用程序和WPF中有應(yīng)用)例如:可將一個類(類名為:MyClass)的編寫工作同時分配給3個人,每人負責(zé)寫一個文件,文件名可以分別為MyClassP1.cs、MyClassP2.cs和MyClassP3.cs,每個文件內(nèi)都用下面的形式定義MyClass類:這樣就可讓多個人同時在一個類中分別實現(xiàn)自己的代碼,而且還能相互看到其他文件中MyClass類定義的成員(屬性、方法等)。

3.1.2訪問修飾符publicpartialclassMyClass{ //……}3.1.2訪問修飾符【例3-1】演示如何聲明類、字段、構(gòu)造函數(shù)和方法,同時說明如何實例化對象、如何使用分部類以及如何輸出實例數(shù)據(jù)7請大家看書P71頁下方Student類的例子83.1.3靜態(tài)成員和實例成員通過類名調(diào)用靜態(tài)成員,通過實例名調(diào)用實例成員。1.static關(guān)鍵字表示類或成員加載到內(nèi)存中只有一份,而不是有多個實例。當垃圾回收器檢測到不再使用該靜態(tài)成員時,會自動釋放其占用的內(nèi)存。可用于類、字段、方法、屬性、運算符、事件和構(gòu)造函數(shù),但不能用于索引器、析構(gòu)函數(shù)或者類以外的類型。靜態(tài)字段有兩個常見的用法:一是記錄已實例化對象的個數(shù),二是存儲必須在所有實例之間共享的值。靜態(tài)方法可以被重載但不能被重寫,因為它們屬于類,而不屬于類的任何實例。93.1.3靜態(tài)成員和實例成員2.靜態(tài)類聲明自定義類時如果加上static關(guān)鍵字,則該類就是靜態(tài)類。靜態(tài)類的主要特點:僅包含靜態(tài)成員。無法實例化。這與在非靜態(tài)類中定義私有構(gòu)造函數(shù)可阻止類被實例化的機制相似。是密封的,因此不能被繼承。不能包含實例構(gòu)造函數(shù),但可以包含靜態(tài)構(gòu)造函數(shù)。如果非靜態(tài)類包含需要進行重要的初始化的靜態(tài)成員,也應(yīng)定義靜態(tài)構(gòu)造函數(shù)。103.1.4構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù):是創(chuàng)建對象時自動調(diào)用的函數(shù)。一般在構(gòu)造函數(shù)中做一些初始化工作,或者做一些僅需執(zhí)行一次的特定操作。構(gòu)造函數(shù)沒有返回類型,并且它的名稱與其所屬的類的名稱相同。C#支持兩種構(gòu)造函數(shù):實例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)。1.實例構(gòu)造函數(shù)每創(chuàng)建一個對象,都會先通過new關(guān)鍵字指明調(diào)用的構(gòu)造函數(shù),這種構(gòu)造函數(shù)稱為實例構(gòu)造函數(shù)。例如:Childchild=newChild();這條語句的Child()就是被調(diào)用的實例構(gòu)造函數(shù)。113.1.4構(gòu)造函數(shù)和析構(gòu)函數(shù)2.靜態(tài)構(gòu)造函數(shù)(了解即可)如果構(gòu)造函數(shù)聲明包含static修飾符,則為靜態(tài)構(gòu)造函數(shù),否則為實例構(gòu)造函數(shù)。創(chuàng)建第一個實例或引用任何靜態(tài)成員之前,CLR會自動調(diào)用靜態(tài)構(gòu)造函數(shù)。例如: classSimpleClass { staticreadonlylongbaseline; staticSimpleClass() { baseline=DateTime.Now.Ticks; } }123.1.4構(gòu)造函數(shù)和析構(gòu)函數(shù)靜態(tài)構(gòu)造函數(shù)的特點:靜態(tài)構(gòu)造函數(shù)既沒有訪問修飾符,也沒有參數(shù)。在創(chuàng)建第一個實例或引用任何靜態(tài)成員之前,CLR會自動調(diào)用靜態(tài)構(gòu)造函數(shù)來初始化類。換言之,靜態(tài)構(gòu)造函數(shù)是在實例構(gòu)造函數(shù)之前執(zhí)行的。程序員無法直接調(diào)用靜態(tài)構(gòu)造函數(shù),也無法控制何時執(zhí)行靜態(tài)構(gòu)造函數(shù)靜態(tài)構(gòu)造函數(shù)僅調(diào)用一次。如果靜態(tài)構(gòu)造函數(shù)引發(fā)異常,在程序運行所在的應(yīng)用程序域的生存期內(nèi),類型將一直保持未初始化的狀態(tài)。133.1.3構(gòu)造函數(shù)和析構(gòu)函數(shù)3.默認構(gòu)造函數(shù)和私有構(gòu)造函數(shù)每個類要求必須至少有一個構(gòu)造函數(shù)。如果代碼中沒有聲明構(gòu)造函數(shù),則系統(tǒng)會自動為該類提供一個不帶參數(shù)的空的構(gòu)造函數(shù),這種自動提供的構(gòu)造函數(shù)稱為默認構(gòu)造函數(shù)。構(gòu)造函數(shù)一般用public修飾符,但也可以用private創(chuàng)建私有構(gòu)造函數(shù)。私有構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),通常用在只包含靜態(tài)成員的類中,用來阻止該類被實例化。如果不指定構(gòu)造函數(shù)的訪問修飾符,默認是private。但是,一般都顯式地使用private修飾符來清楚地表明該類不能被實例化。4.重載構(gòu)造函數(shù)構(gòu)造函數(shù)可以被重載(Overloading),但不能被繼承。請看書P74頁中間部分的說明143.1.4構(gòu)造函數(shù)和析構(gòu)函數(shù)5.析構(gòu)函數(shù)和自動內(nèi)存管理(了解即可)析構(gòu)函數(shù)析構(gòu)函數(shù)是一種用于實現(xiàn)銷毀類實例所需操作的成員。析構(gòu)函數(shù)不能帶參數(shù),也不能包含訪問修飾符。析構(gòu)函數(shù)是自動調(diào)用的,不能顯式調(diào)用析構(gòu)函數(shù)。自動內(nèi)存管理由C#使用垃圾回收器實現(xiàn),即自動決定何時釋放和銷毀內(nèi)存。如果聲明了析構(gòu)函數(shù),開發(fā)人員也可通過System.GC的靜態(tài)方法在一定程度上控制垃圾回收器的行為。該類可用于請求執(zhí)行一次回收操作、并自動判斷是否應(yīng)該執(zhí)行析構(gòu)函數(shù)。153.1.5字段和局部變量字段是類的成員,局部變量是塊的成員。1.字段(即:私有的類成員屬性)字段是指在類或結(jié)構(gòu)中聲明的“類級別”的變量。或者說,字段是整個類內(nèi)部的所有方法和事件中都可以訪問的變量。2.只讀字段(readonly)readonly關(guān)鍵字用于聲明可以在程序運行期間只能初始化“一次”的字段。初始化的方法有兩種,一種是在聲明語句中初始化該字段,另一種是在構(gòu)造函數(shù)中初始化該字段。3.局部變量局部變量是相對于字段來說的。可以將局部變量理解為“塊”級別的變量。請看P76頁上方的小例子請看P76頁中間的小例子163.1.6結(jié)構(gòu)的定義和成員組織結(jié)構(gòu)是值類型,它和類的主要區(qū)別是結(jié)構(gòu)中的數(shù)據(jù)保存在堆棧(Stack)中而不是保存在堆(Heap)中。另外,所有結(jié)構(gòu)都隱式地從Object繼承,但自定義結(jié)構(gòu)時,不能從其他結(jié)構(gòu)繼承。結(jié)構(gòu)成員和類成員相同,包括字段、屬性、構(gòu)造函數(shù)、方法、事件、運算符、索引器、析構(gòu)函數(shù)等?!纠?-2】分別用類和結(jié)構(gòu)定義具有x、y坐標的點,然后在主程序中各創(chuàng)建并初始化一個含有10個點的數(shù)組。結(jié)構(gòu)對于具有值語義的小型數(shù)據(jù)尤為有用17183.2屬性和方法3.2.1屬性(Property)3.2.2方法193.2.1屬性(Property)屬性(property)是字段的擴展,用于提供對字段讀寫的手段。屬性和字段的區(qū)別是:屬性通過get訪問器和set訪問器指定讀寫字段的值時需要執(zhí)行的語句,具體地: i.對外公開某字段的訪問權(quán)限(“讀”方法:“get”) ii.對字段的修改進行驗證(“寫”方法:“set”)1.常規(guī)屬性聲明如果需要對外公開某些字段,并對字段的值進行驗證,可以利用屬性的get和set訪問器來實現(xiàn)。2.自動實現(xiàn)的屬性自動實現(xiàn)的屬性是指開發(fā)人員只需要聲明屬性,而與該屬性對應(yīng)的字段則由系統(tǒng)自動提供。自動實現(xiàn)的屬性必須同時聲明get和set訪問器。請看書P79頁上方例子和中間的三段說明!203.2.2方法方法是類或結(jié)構(gòu)的一種成員,是一組程序代碼的集合,用于完成指定的功能。每個方法都有一個方法名,便于識別和讓其他方法調(diào)用。1.方法的聲明和參數(shù)傳遞定義方法的一般形式為

[訪問修飾符]返回值類型

方法名([參數(shù)序列]) { [語句序列] }方法聲明中的參數(shù)用于向方法傳遞值或變量引用。方法的參數(shù)從調(diào)用該方法時指定的實參獲取實際值。有四類參數(shù):值參數(shù)、引用參數(shù)、輸出參數(shù)和參數(shù)數(shù)組。213.2.2方法(1)值參數(shù)值參數(shù)(valueparameter)用于傳遞輸入?yún)?shù)。一個值參數(shù)相當于一個局部變量,只是它的初始值來自為該形參傳遞的實參?!纠?-3】演示值參數(shù)的基本用法??磿鳳80頁下方例子,注意指定參數(shù)默認值的情況223.2.2方法(2)引用參數(shù)

引用參數(shù)(referenceparameter)用于傳遞輸入和輸出參數(shù)。為引用參數(shù)傳遞的實參必須是變量,并且在方法執(zhí)行期間,引用參數(shù)與實參變量表示同一存儲位置。引用參數(shù)使用ref修飾符聲明?!纠?-4】演示引用參數(shù)的基本用法。當將值類型作為引用參數(shù)傳遞時,必須使用ref關(guān)鍵字。對于引用類型來說,可省略ref關(guān)鍵字233.2.2方法(3)輸出參數(shù)輸出參數(shù)(outputparameter)用于傳遞返回的參數(shù),用out關(guān)鍵字聲明。格式為

out參數(shù)類型

參數(shù)名【例3-5】演示out關(guān)鍵字的用法。請看書P82頁上方的例子,注意out關(guān)鍵字的用法243.2.2方法(4)參數(shù)數(shù)組

參數(shù)數(shù)組用于向方法傳遞可變數(shù)目的實參,用params關(guān)鍵字聲明。如果方法有多個參數(shù),只有最后一個參數(shù)才可以用參數(shù)數(shù)組聲明,并且參數(shù)數(shù)組的類型必須是一維數(shù)組類型?!纠?-6】演示params關(guān)鍵字的基本用法。當需要傳遞的參數(shù)的個數(shù)不確定時使用。253.2.2方法2.方法重載

***方法重載是指具有相同的方法名,但參數(shù)類型或參數(shù)個數(shù)不完全相同的多個方法可以同時出現(xiàn)在一個類中。這種技術(shù)非常有用,在項目開發(fā)過程中,我們會發(fā)現(xiàn)很多方法都需要使用方法重載來實現(xiàn)。請看書P83頁下方的例子263.3類的繼承與多態(tài)性3.3.1封裝(簡單復(fù)習(xí))3.3.2繼承(簡單復(fù)習(xí))3.3.3多態(tài)(new、virtual、override)273.3.1封裝封裝一個類時,既可以像定義一個普通的類一樣,也可以將類聲明為抽象類或者密封類。1.抽象類(abstractclass)抽象類使用abstract修飾符來描述,用于表示該類中的成員(例如方法)不一定實現(xiàn),即可以只有聲明部分而沒有實現(xiàn)部分。抽象類只能用做其他類的基類,而且無法直接實例化抽象類。2.密封類(sealed)密封類是指不能被其他類繼承的類。在C#語言中,用sealed修飾符聲明密封類。由于密封類不能被其他類繼承,因此系統(tǒng)就可以在運行時對密封類中的內(nèi)容進行優(yōu)化,從而提高系統(tǒng)的性能。283.3.2繼承繼承用于簡化類的設(shè)計工作量,同時還能避免設(shè)計的不一致性。一般將公共的、相同的部分放在被繼承的類中,非公共的、不相同的部分放在繼承的類中。1.類繼承的一般形式在C#中,用冒號(“:”)表示繼承。被繼承的類叫基類或者父類,從基類繼承的類叫擴充類,又叫派生類或者子類。繼承意味著一個類隱式地將它的基類的所有成員當作自已的成員,而且派生類還能夠在繼承基類的基礎(chǔ)上繼續(xù)添加新的成員。但是,基類的實例構(gòu)造函數(shù)、靜態(tài)構(gòu)造函數(shù)和析構(gòu)函數(shù)除外。擴充類不能繼承基類中所定義的private成員,只能繼承基類的public成員或protected成員。293.3.2繼承2.繼承過程中構(gòu)造函數(shù)的處理擴充類可繼承基類中聲明為public或protected的成員。構(gòu)造函數(shù)在擴充類中不會被繼承下來。如果讓構(gòu)造函數(shù)也能繼承,由于擴充類中無法訪問基類的私有成員,從而導(dǎo)致程序運行失敗。C#在內(nèi)部按照下列順序處理構(gòu)造函數(shù):從擴充類依次向上尋找其基類,直到找到最初的基類,然后開始執(zhí)行最初的基類的構(gòu)造函數(shù),再依次向下執(zhí)行擴充類的構(gòu)造函數(shù),直至執(zhí)行完最終的擴充類的構(gòu)造函數(shù)為止。(了解即可)【例3-7】演示繼承的基本用法。30313.3.3多態(tài)(new、virtual、override)

多態(tài)性的定義是:同一操作可分別作用于不同的類的實例,此時不同的類將進行不同的解釋,最后產(chǎn)生不同的執(zhí)行結(jié)果。也就是說,具有不同功能的方法可以用一個方法名。

在面向?qū)ο蠓椒ㄖ羞@樣描述多態(tài)性:向不同的對象發(fā)送同一個消息,它們接收后會產(chǎn)生不同的行為(即方法)。消息是指對類的成員函數(shù)的調(diào)用;不同的行為是指不同的實現(xiàn),也就是調(diào)用了不同的函數(shù)。

請從P89頁開始逐行劃重點!

函數(shù)的重載、運算符重載都是多態(tài)現(xiàn)象。

從系統(tǒng)實現(xiàn)的觀點看,多態(tài)性分為兩類:靜態(tài)多態(tài)和動態(tài)多態(tài)性。以前學(xué)過的函數(shù)重載和運算符重載屬于靜態(tài)多態(tài)性,在編譯程序時系統(tǒng)就可以確定調(diào)用哪個函數(shù),因此靜態(tài)多態(tài)性又稱編譯時的多態(tài)性。靜態(tài)多態(tài)性是通過函數(shù)重載實現(xiàn)的。

動態(tài)多態(tài)性是在程序運行中才能確定所針對的操作對象。它又稱運行時的多態(tài)性。動態(tài)多態(tài)性是通過虛函數(shù)實現(xiàn)的。3.3.3多態(tài)(new、virtual、override)

例如:設(shè)類B是類A的子類,即:類B繼承自類A。如果子類B和父類A中都定義有同名的方法,當使用B類的對象調(diào)用該方法時,定義這個對象的類,也就是父類A中的同名方法將被調(diào)用。

如果在父類A中的該方法前加上virtual關(guān)鍵字,并且在子類B中的同名方法前面加override關(guān)鍵字(即:在子類中重寫基類的方法),那么子類B中的同名方法將被調(diào)用!333.3.3多態(tài)(new、virtual、override)有以下幾種實現(xiàn)多態(tài)性的方式:i.通過繼承實現(xiàn)多態(tài)性:多個類可以繼承自同一個類,每個擴充類中又可根據(jù)需要重寫基類成員以提供不同的功能。ii.通過抽象類實現(xiàn)多態(tài)性:抽象類本身不能被實例化,只能在擴充類中通過繼承使用。抽象類的部分或全部成員不一定都要實現(xiàn),但是要在繼承類中全部實現(xiàn)。抽象類中已實現(xiàn)的成員仍可以被重寫,并且繼承類仍可以實現(xiàn)其他功能。iii.通過接口實現(xiàn)多態(tài)性:多個類可以實現(xiàn)相同的“接口”,并且一個類可以實現(xiàn)一個或多個接口。接口本質(zhì)上是類需要如何響應(yīng)的定義。接口僅聲明類需要實現(xiàn)的方法、屬性和事件,以及每個成員需要接收和返回的參數(shù)類型,而這些成員的特定實現(xiàn)則留給實現(xiàn)類去完成。34請看書P89頁下方的例子舉例:

定義一個抽象類:北京菜

類中的純虛函數(shù)包括:{

宮保雞丁做法

醬爆雞丁做法

魚香肉絲做法

糖醋里脊做法 }但是每道菜都沒有具體的實現(xiàn),而是要根據(jù)派生類的不同,定義具體的不同的詳細的炒菜(實現(xiàn))方法因為不同的人,做同一道菜的炒法和“實現(xiàn)”會有所不同。比如大廚(類)和普通人(類)的做法就不同;兒子(類)從爸爸(類)那里學(xué)來基本做法,更可能有自己的做法(重寫:override)3.3.3多態(tài)(new、virtual、override)1.虛擬(virtual)和重寫(override)使用虛擬方法與重寫方法時,需要注意下面幾個方面。虛擬方法不能聲明為靜態(tài)(static)的。因為靜態(tài)的方法是應(yīng)用在類這一層次的,而面向?qū)ο蟮亩鄳B(tài)性只能通過對象進行操作,所以無法通過類名直接調(diào)用。virtual不能和private一起使用。聲明為private就無法在擴充類中重寫了。重寫方法的名稱、參數(shù)個數(shù)、參數(shù)類型以及返回類型都必須和虛擬方法的一致。36請看書P90頁中間的例子373.3.3多態(tài)(new、virtual、override)2.隱藏(new)編寫方法時,如果希望擴充類重寫基類的方法,需要在擴充類中用override聲明;如果希望隱藏基類的方法,在擴充類中需要用new聲明,這就是C#語言進行版本控制的依據(jù)。除了重寫基類的方法外,還可以在擴充類中使用new修飾符來隱藏基類中同名的方法。與方法重寫不同的是,使用new關(guān)鍵字時并不要求基類中的方法聲明為virtual,只要在擴充類的方法前聲明為new,就可以隱藏基類的方法。383.3.3多態(tài)(new、virtual、override)3.在擴充類中直接調(diào)用基類的方法可以在擴充類中通過base關(guān)鍵字直接調(diào)用基類的方法,例如:classMyBaseClass{publicvirtualintMyMethod(){return5;}}classMyDerivedClass:MyBaseClass{publicoverrideintMyMethod(){returnbase.MyMethod()*4;}}39403.4常用結(jié)構(gòu)和類的用法3.4.1Math類3.4.2DateTime結(jié)構(gòu)和TimeSpan結(jié)構(gòu)3.4.3秒表和計時器3.4.4隨機數(shù)413.4.1Math類Math類定義了各種常用的數(shù)學(xué)運算,該類位于System命名空間下,其

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論