




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6章面向?qū)ο蟪绦蛟O(shè)計(jì)章面向?qū)ο蟪绦蛟O(shè)計(jì) 6.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概述6.2 命名空間命名空間6.3 類(lèi)類(lèi)6.4 對(duì)象對(duì)象6.5 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)6.6 靜態(tài)成員靜態(tài)成員 6.7 屬性屬性6.8 方法方法 6.9 索引器索引器6.10 委托委托6.11 事件事件6.12 運(yùn)算符重載運(yùn)算符重載6.13 類(lèi)的轉(zhuǎn)換類(lèi)的轉(zhuǎn)換 6.1 面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)概述 6.1.1 面向?qū)ο蟮幕靖拍蠲嫦驅(qū)ο蟮幕靖拍頻 類(lèi)和對(duì)象類(lèi)和對(duì)象l 屬性、方法和事件屬性、方法和事件l 封裝封裝l 繼承繼承l(wèi) 重載與重寫(xiě)重載與重寫(xiě)6.1.2 面向?qū)ο蟮膬?yōu)點(diǎn)面向?qū)ο蟮?/p>
2、優(yōu)點(diǎn)l 維護(hù)簡(jiǎn)單。維護(hù)簡(jiǎn)單。l 可擴(kuò)充性??蓴U(kuò)充性。l 代碼重用。代碼重用。6.2 命名空間命名空間6.2.1 命名空間概述命名空間概述 在在.NET中,類(lèi)是通過(guò)命名空間(中,類(lèi)是通過(guò)命名空間(namespace)來(lái)組織的。)來(lái)組織的。命名空間提供了可以將類(lèi)分成邏輯組的方法,將系統(tǒng)中的大命名空間提供了可以將類(lèi)分成邏輯組的方法,將系統(tǒng)中的大量類(lèi)庫(kù)有序地組織起來(lái),使得類(lèi)更容易使用和管理。量類(lèi)庫(kù)有序地組織起來(lái),使得類(lèi)更容易使用和管理。 可以將命名空間想像成文件夾,類(lèi)的文件夾就是命名空可以將命名空間想像成文件夾,類(lèi)的文件夾就是命名空間,不同的命名空間內(nèi),可以定義許多類(lèi)。在每個(gè)命名空間間,不同的命名空間
3、內(nèi),可以定義許多類(lèi)。在每個(gè)命名空間下,所有的類(lèi)都是下,所有的類(lèi)都是“獨(dú)立獨(dú)立”且且“唯一唯一”的。的。6.2.2 使用命名空間使用命名空間 在在C#中,使用命名空間有兩種方式,一種是明確指出命名中,使用命名空間有兩種方式,一種是明確指出命名空間的位置,另一種是通過(guò)空間的位置,另一種是通過(guò)using關(guān)鍵字引用命名空間。關(guān)鍵字引用命名空間。 直接定位在應(yīng)用程序中,任何一個(gè)命名空間都可以在代碼直接定位在應(yīng)用程序中,任何一個(gè)命名空間都可以在代碼中直接使用。例如:中直接使用。例如: System.Console.WriteLine(ABC); 這個(gè)語(yǔ)句是調(diào)用了這個(gè)語(yǔ)句是調(diào)用了System命名空間中命名空
4、間中Console類(lèi)的類(lèi)的WriteLine方法。方法。1)使用)使用using關(guān)鍵字關(guān)鍵字 在應(yīng)用程序中要使用一個(gè)命名空間,還可以采取引用命名在應(yīng)用程序中要使用一個(gè)命名空間,還可以采取引用命名空間的方法,在引用后,應(yīng)用程序中就可使用該命名空間內(nèi)的空間的方法,在引用后,應(yīng)用程序中就可使用該命名空間內(nèi)的任一個(gè)類(lèi)了。引用命名空間的方法是利用任一個(gè)類(lèi)了。引用命名空間的方法是利用using關(guān)鍵字,其使關(guān)鍵字,其使用格式如下:用格式如下: using 別名別名= 命名空間命名空間或或 using 別名別名= 命名空間命名空間.成員成員 2)自定義命名空間)自定義命名空間 在在C#中,除了使用系統(tǒng)的命名空
5、間外,還可以在應(yīng)用程中,除了使用系統(tǒng)的命名空間外,還可以在應(yīng)用程序中自已聲明命名空間。其使用語(yǔ)法格式如下:序中自已聲明命名空間。其使用語(yǔ)法格式如下: namespace命名空間名稱(chēng)命名空間名稱(chēng) 命名空間定義體命名空間定義體 其中,其中,“命名空間名稱(chēng)命名空間名稱(chēng)”指出命名空間的唯一名稱(chēng),必須指出命名空間的唯一名稱(chēng),必須是有效的是有效的C#標(biāo)識(shí)符。例如,在應(yīng)用程序中自定義標(biāo)識(shí)符。例如,在應(yīng)用程序中自定義Ns1命名命名空間:空間: namespace Ns1 class A class B 6.3類(lèi)類(lèi)6.3.1類(lèi)的聲明類(lèi)的聲明類(lèi)的聲明語(yǔ)法格式如下:類(lèi)的聲明語(yǔ)法格式如下:類(lèi)的修飾符類(lèi)的修飾符 cla
6、ss 類(lèi)名類(lèi)名 :基類(lèi)名基類(lèi)名 /類(lèi)的成員類(lèi)的成員;類(lèi)的修飾符類(lèi)的修飾符說(shuō)明說(shuō)明public公有類(lèi)。表示不受限制對(duì)該類(lèi)的訪問(wèn)。公有類(lèi)。表示不受限制對(duì)該類(lèi)的訪問(wèn)。protected保護(hù)類(lèi)。表示只能從所在類(lèi)和所在類(lèi)派生的子類(lèi)進(jìn)行訪問(wèn)。保護(hù)類(lèi)。表示只能從所在類(lèi)和所在類(lèi)派生的子類(lèi)進(jìn)行訪問(wèn)。internal內(nèi)部類(lèi)。只有其所在類(lèi)才能訪問(wèn)。內(nèi)部類(lèi)。只有其所在類(lèi)才能訪問(wèn)。private私有類(lèi)。只有該類(lèi)才能訪問(wèn)。私有類(lèi)。只有該類(lèi)才能訪問(wèn)。abstract抽象類(lèi)。表示該類(lèi)是一個(gè)不完整的類(lèi),不允許建立類(lèi)的實(shí)抽象類(lèi)。表示該類(lèi)是一個(gè)不完整的類(lèi),不允許建立類(lèi)的實(shí)例。例。sealed密封類(lèi)。不允許從該類(lèi)派生新的類(lèi)。密封類(lèi)。
7、不允許從該類(lèi)派生新的類(lèi)。例如,以下聲明了一個(gè)例如,以下聲明了一個(gè)Person類(lèi):類(lèi):public class Personpublic int pno; /編號(hào)編號(hào) public string pname;/姓名姓名public void setdata(int no,string name) pno=no; pname=name; public void dispdata() Console.WriteLine(0 1, pno, pname); 6.3.2類(lèi)的成員類(lèi)的成員類(lèi)的成員類(lèi)的成員說(shuō)明說(shuō)明字段字段字段存儲(chǔ)類(lèi)要滿(mǎn)足其設(shè)計(jì)所需要的數(shù)據(jù),亦稱(chēng)為數(shù)據(jù)成員。字段存儲(chǔ)類(lèi)要滿(mǎn)足其設(shè)計(jì)所需要的數(shù)據(jù),
8、亦稱(chēng)為數(shù)據(jù)成員。屬性屬性屬性是類(lèi)中可以像類(lèi)中的字段一樣被訪問(wèn)的方法。屬性可以為類(lèi)字屬性是類(lèi)中可以像類(lèi)中的字段一樣被訪問(wèn)的方法。屬性可以為類(lèi)字段提供保護(hù),避免字段在對(duì)象不知道的情況下被更改。段提供保護(hù),避免字段在對(duì)象不知道的情況下被更改。方法方法方法定義類(lèi)可以執(zhí)行的操作。方法可以接受提供輸入數(shù)據(jù)的參數(shù),方法定義類(lèi)可以執(zhí)行的操作。方法可以接受提供輸入數(shù)據(jù)的參數(shù),并且可以通過(guò)參數(shù)返回輸出數(shù)據(jù)。方法還可以不使用參數(shù)而直接返并且可以通過(guò)參數(shù)返回輸出數(shù)據(jù)。方法還可以不使用參數(shù)而直接返回值。回值。事件事件事件是向其他對(duì)象提供有關(guān)事件發(fā)生(如單擊按鈕或成功完成某個(gè)事件是向其他對(duì)象提供有關(guān)事件發(fā)生(如單擊按鈕或
9、成功完成某個(gè)方法)通知的一種方式。方法)通知的一種方式。索引器索引器索引器允許以類(lèi)似于數(shù)組的方式為對(duì)象建立索引。索引器允許以類(lèi)似于數(shù)組的方式為對(duì)象建立索引。運(yùn)算符運(yùn)算符運(yùn)算符是對(duì)操作數(shù)執(zhí)行運(yùn)算的術(shù)語(yǔ)或符號(hào),如運(yùn)算符是對(duì)操作數(shù)執(zhí)行運(yùn)算的術(shù)語(yǔ)或符號(hào),如 +、*、); p1.dispoint(); TPoint p2 = new TPoint();/ 定義對(duì)象定義對(duì)象p2 p2.setpoint(8,3); Console.Write(第二個(gè)點(diǎn)第二個(gè)點(diǎn)=); p2.dispoint(); 6.5 構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)6.5.1構(gòu)造函數(shù)構(gòu)造函數(shù)1. 什么是構(gòu)造函數(shù)什么是構(gòu)造函數(shù)構(gòu)造函數(shù)
10、是在創(chuàng)建給定類(lèi)型的對(duì)象時(shí)執(zhí)行的類(lèi)方法。構(gòu)造構(gòu)造函數(shù)是在創(chuàng)建給定類(lèi)型的對(duì)象時(shí)執(zhí)行的類(lèi)方法。構(gòu)造函數(shù)具有如下性質(zhì):函數(shù)具有如下性質(zhì):l 構(gòu)造函數(shù)的名稱(chēng)與類(lèi)的名稱(chēng)相同。構(gòu)造函數(shù)的名稱(chēng)與類(lèi)的名稱(chēng)相同。l 構(gòu)造函數(shù)盡管是一個(gè)函數(shù),但沒(méi)有任何類(lèi)型,即它既不屬于返回值函數(shù)也構(gòu)造函數(shù)盡管是一個(gè)函數(shù),但沒(méi)有任何類(lèi)型,即它既不屬于返回值函數(shù)也不屬于不屬于void函數(shù)。函數(shù)。l 一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù),但所有構(gòu)造函數(shù)的名稱(chēng)都必須相同,它們的一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù),但所有構(gòu)造函數(shù)的名稱(chēng)都必須相同,它們的參數(shù)各不相同,即構(gòu)造函數(shù)可以重載。參數(shù)各不相同,即構(gòu)造函數(shù)可以重載。l 當(dāng)類(lèi)對(duì)象創(chuàng)建時(shí),構(gòu)造函數(shù)會(huì)自動(dòng)地執(zhí)行;由
11、于它們沒(méi)有返回類(lèi)型,因此當(dāng)類(lèi)對(duì)象創(chuàng)建時(shí),構(gòu)造函數(shù)會(huì)自動(dòng)地執(zhí)行;由于它們沒(méi)有返回類(lèi)型,因此不能像其他函數(shù)那樣進(jìn)行調(diào)用。不能像其他函數(shù)那樣進(jìn)行調(diào)用。l 當(dāng)類(lèi)對(duì)象聲明時(shí),調(diào)用哪一個(gè)構(gòu)造函數(shù)取決于傳遞給它的參數(shù)類(lèi)型。當(dāng)類(lèi)對(duì)象聲明時(shí),調(diào)用哪一個(gè)構(gòu)造函數(shù)取決于傳遞給它的參數(shù)類(lèi)型。l 構(gòu)造函數(shù)不能被繼承。構(gòu)造函數(shù)不能被繼承。2. 調(diào)用構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)當(dāng)定義類(lèi)對(duì)象時(shí),構(gòu)造函數(shù)會(huì)自動(dòng)執(zhí)行。當(dāng)定義類(lèi)對(duì)象時(shí),構(gòu)造函數(shù)會(huì)自動(dòng)執(zhí)行。1)調(diào)用默認(rèn)構(gòu)造函數(shù))調(diào)用默認(rèn)構(gòu)造函數(shù) 不帶參數(shù)的構(gòu)造函數(shù)稱(chēng)為默認(rèn)構(gòu)造函數(shù)。無(wú)論何時(shí),只要不帶參數(shù)的構(gòu)造函數(shù)稱(chēng)為默認(rèn)構(gòu)造函數(shù)。無(wú)論何時(shí),只要使用使用new運(yùn)算符實(shí)例化對(duì)象,并且不為運(yùn)算符
12、實(shí)例化對(duì)象,并且不為new提供任何參數(shù),就提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。假設(shè)一個(gè)類(lèi)包含有默認(rèn)構(gòu)造函數(shù),調(diào)會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。假設(shè)一個(gè)類(lèi)包含有默認(rèn)構(gòu)造函數(shù),調(diào)用默認(rèn)構(gòu)造函數(shù)的語(yǔ)法如下:用默認(rèn)構(gòu)造函數(shù)的語(yǔ)法如下: 類(lèi)名類(lèi)名 對(duì)象名對(duì)象名=new 類(lèi)名類(lèi)名(); 如果沒(méi)有為對(duì)象提供構(gòu)造函數(shù),則默認(rèn)情況下如果沒(méi)有為對(duì)象提供構(gòu)造函數(shù),則默認(rèn)情況下 C#將創(chuàng)建將創(chuàng)建一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)實(shí)例化對(duì)象,并將所有成員變量一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)實(shí)例化對(duì)象,并將所有成員變量設(shè)置為相應(yīng)的默認(rèn)值。設(shè)置為相應(yīng)的默認(rèn)值。2)調(diào)用帶參數(shù)的構(gòu)造函數(shù))調(diào)用帶參數(shù)的構(gòu)造函數(shù) 假設(shè)一個(gè)類(lèi)中包含有帶參數(shù)的構(gòu)造函數(shù),調(diào)用這種帶
13、參數(shù)假設(shè)一個(gè)類(lèi)中包含有帶參數(shù)的構(gòu)造函數(shù),調(diào)用這種帶參數(shù)的構(gòu)造函數(shù)的語(yǔ)法如下:的構(gòu)造函數(shù)的語(yǔ)法如下:類(lèi)名類(lèi)名 對(duì)象名對(duì)象名=new 類(lèi)名類(lèi)名(參數(shù)表參數(shù)表);【例【例6.2】 設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明調(diào)用構(gòu)造函數(shù)的過(guò)程。設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明調(diào)用構(gòu)造函數(shù)的過(guò)程。 namespace Proj6_2 class Program public class TPoint1 /聲明類(lèi)聲明類(lèi)TPoint1 int x, y; /類(lèi)的私有變量類(lèi)的私有變量 public TPoint1() /默認(rèn)的構(gòu)造函數(shù)默認(rèn)的構(gòu)造函數(shù) public TPoint1(int x1, int y1) /帶參數(shù)的構(gòu)造函
14、數(shù)帶參數(shù)的構(gòu)造函數(shù) x = x1; y = y1; public void dispoint() Console.WriteLine(0,1), x, y); static void Main(string args) TPoint1 p1 = new TPoint1(); /調(diào)用默認(rèn)的構(gòu)造函數(shù)調(diào)用默認(rèn)的構(gòu)造函數(shù) Console.Write(第一個(gè)點(diǎn)第一個(gè)點(diǎn)=); p1.dispoint(); TPoint1 p2 = new TPoint1(8, 3);/調(diào)用帶參數(shù)的構(gòu)造函數(shù)調(diào)用帶參數(shù)的構(gòu)造函數(shù) Console.Write(第二個(gè)點(diǎn)第二個(gè)點(diǎn)=); p2.dispoint(); 6.5.2析構(gòu)
15、函數(shù)析構(gòu)函數(shù) 1. 什么是析構(gòu)函數(shù)什么是析構(gòu)函數(shù) 在對(duì)象不再需要時(shí),希望確保它所占的存儲(chǔ)空間能被收在對(duì)象不再需要時(shí),希望確保它所占的存儲(chǔ)空間能被收回?;亍#中提供了析構(gòu)函數(shù)用于專(zhuān)門(mén)釋放被占用的系統(tǒng)資中提供了析構(gòu)函數(shù)用于專(zhuān)門(mén)釋放被占用的系統(tǒng)資源。析構(gòu)函數(shù)具有如下性質(zhì):源。析構(gòu)函數(shù)具有如下性質(zhì):l 析構(gòu)函數(shù)在類(lèi)對(duì)象銷(xiāo)毀時(shí)自動(dòng)執(zhí)行。析構(gòu)函數(shù)在類(lèi)對(duì)象銷(xiāo)毀時(shí)自動(dòng)執(zhí)行。l 一個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù),而且析構(gòu)函數(shù)沒(méi)有參一個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù),而且析構(gòu)函數(shù)沒(méi)有參數(shù),即析構(gòu)函數(shù)不能重載。數(shù),即析構(gòu)函數(shù)不能重載。l 析構(gòu)函數(shù)的名稱(chēng)是析構(gòu)函數(shù)的名稱(chēng)是“”加上類(lèi)的名稱(chēng)(中間沒(méi)有空加上類(lèi)的名稱(chēng)(中間沒(méi)有空格)。格)
16、。l 與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也沒(méi)有返回類(lèi)型。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也沒(méi)有返回類(lèi)型。l 析構(gòu)函數(shù)不能被繼承。析構(gòu)函數(shù)不能被繼承。2. 調(diào)用析構(gòu)函數(shù)調(diào)用析構(gòu)函數(shù)當(dāng)一個(gè)對(duì)象被系統(tǒng)銷(xiāo)毀時(shí)自動(dòng)調(diào)用類(lèi)的析構(gòu)函數(shù)。當(dāng)一個(gè)對(duì)象被系統(tǒng)銷(xiāo)毀時(shí)自動(dòng)調(diào)用類(lèi)的析構(gòu)函數(shù)?!纠纠?.3】 設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明調(diào)用析構(gòu)函數(shù)的過(guò)程。設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明調(diào)用析構(gòu)函數(shù)的過(guò)程。 using System;namespace Proj6_3 class Program public class TPoint2 /聲明類(lèi)聲明類(lèi)TPoint2 int x, y; public TPoint2(int x1, int
17、y1) /帶參數(shù)的構(gòu)造函數(shù)帶參數(shù)的構(gòu)造函數(shù) x = x1; y = y1; TPoint2() Console.WriteLine(點(diǎn)點(diǎn)=(0,1), x, y); static void Main(string args) TPoint2 p1 = new TPoint2(2,6); TPoint2 p2 = new TPoint2(8, 3); 6.6 靜態(tài)成員靜態(tài)成員 6.6.1 靜態(tài)字段靜態(tài)字段 靜態(tài)字段是類(lèi)中所有對(duì)象共享的成員,而不是某個(gè)對(duì)靜態(tài)字段是類(lèi)中所有對(duì)象共享的成員,而不是某個(gè)對(duì)象的成員,也就是說(shuō)靜態(tài)字段的存儲(chǔ)空間不是放在每個(gè)對(duì)象的成員,也就是說(shuō)靜態(tài)字段的存儲(chǔ)空間不是放在每個(gè)對(duì)
18、象中,而是和方法一樣放在類(lèi)公共區(qū)中。象中,而是和方法一樣放在類(lèi)公共區(qū)中。 對(duì)靜態(tài)字段的操作和一般字段一樣,定義為私有的靜對(duì)靜態(tài)字段的操作和一般字段一樣,定義為私有的靜態(tài)字段不能被外界訪問(wèn)。靜態(tài)字段的使用方法如下:態(tài)字段不能被外界訪問(wèn)。靜態(tài)字段的使用方法如下: (1)靜態(tài)字段的定義與一般字段相似,但前面要加上)靜態(tài)字段的定義與一般字段相似,但前面要加上static關(guān)鍵詞。關(guān)鍵詞。 (2)在訪問(wèn)靜態(tài)字段時(shí)采用如下格式:)在訪問(wèn)靜態(tài)字段時(shí)采用如下格式: 類(lèi)名類(lèi)名.靜態(tài)字段名靜態(tài)字段名6.6.2 靜態(tài)方法靜態(tài)方法 靜態(tài)方法與靜態(tài)字段類(lèi)似,也是從屬于類(lèi),都是類(lèi)的靜靜態(tài)方法與靜態(tài)字段類(lèi)似,也是從屬于類(lèi),都
19、是類(lèi)的靜態(tài)成員。只要類(lèi)存在,靜態(tài)方法就可以使用,靜態(tài)方法的態(tài)成員。只要類(lèi)存在,靜態(tài)方法就可以使用,靜態(tài)方法的定義是在一般方法定義前加上定義是在一般方法定義前加上static關(guān)鍵字。調(diào)用靜態(tài)方關(guān)鍵字。調(diào)用靜態(tài)方法的格式如下:法的格式如下: 類(lèi)名類(lèi)名.靜態(tài)方法名靜態(tài)方法名(參數(shù)表參數(shù)表); 注意:靜態(tài)方法只能訪問(wèn)靜態(tài)字段、其他靜態(tài)方法和類(lèi)注意:靜態(tài)方法只能訪問(wèn)靜態(tài)字段、其他靜態(tài)方法和類(lèi)以外的函數(shù)及數(shù)據(jù),不能訪問(wèn)類(lèi)中的非靜態(tài)成員(因?yàn)榉且酝獾暮瘮?shù)及數(shù)據(jù),不能訪問(wèn)類(lèi)中的非靜態(tài)成員(因?yàn)榉庆o態(tài)成員只有對(duì)象存在時(shí)才有意義)。但靜態(tài)字段和靜態(tài)靜態(tài)成員只有對(duì)象存在時(shí)才有意義)。但靜態(tài)字段和靜態(tài)方法可由任意訪問(wèn)
20、權(quán)限許可的成員訪問(wèn)。方法可由任意訪問(wèn)權(quán)限許可的成員訪問(wèn)。6.7屬性屬性6.7.1什么是屬性什么是屬性 屬性描述了對(duì)象的具體特性,它提供了對(duì)類(lèi)或?qū)ο蟪蓡T屬性描述了對(duì)象的具體特性,它提供了對(duì)類(lèi)或?qū)ο蟪蓡T的訪問(wèn)。的訪問(wèn)。 C#中的屬性更充分地體現(xiàn)了對(duì)象的封裝性,屬性不直接中的屬性更充分地體現(xiàn)了對(duì)象的封裝性,屬性不直接操作類(lèi)的字段,而是通過(guò)訪問(wèn)器進(jìn)行訪問(wèn)。操作類(lèi)的字段,而是通過(guò)訪問(wèn)器進(jìn)行訪問(wèn)。6.7.2屬性聲明屬性聲明 屬性在類(lèi)模塊里是采用下面的方式進(jìn)行聲明的,即指定屬性在類(lèi)模塊里是采用下面的方式進(jìn)行聲明的,即指定變量的訪問(wèn)級(jí)別、屬性的類(lèi)型、屬性的名稱(chēng),然后是變量的訪問(wèn)級(jí)別、屬性的類(lèi)型、屬性的名稱(chēng),然
21、后是get訪訪問(wèn)器或者問(wèn)器或者set訪問(wèn)器代碼塊。其語(yǔ)法格式如下:訪問(wèn)器代碼塊。其語(yǔ)法格式如下: 修飾符修飾符 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型 屬性名稱(chēng)屬性名稱(chēng) get訪問(wèn)器訪問(wèn)器 set訪問(wèn)器訪問(wèn)器 其中,修飾符有其中,修飾符有new、public、protected、internal、private、static、virtual、override和和abstract。【例【例6.7】 設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明屬性的使用。設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明屬性的使用。using System;namespace Proj6_7 public class TPoint3 /聲明類(lèi)聲明類(lèi)TPoint3 int
22、x,y; public int px get/get訪問(wèn)器訪問(wèn)器 return x; set/set訪問(wèn)器訪問(wèn)器 x = value; public int py get/get訪問(wèn)器訪問(wèn)器 return y; set/set訪問(wèn)器訪問(wèn)器 y = value; ; class Program static void Main(string args) TPoint3 p = new TPoint3(); p.px = 3; p.py = 8; /屬性寫(xiě)操作屬性寫(xiě)操作 Console.WriteLine(點(diǎn)點(diǎn)=(0,1), p.px, p.py);/屬性讀操作屬性讀操作 點(diǎn)點(diǎn)=(3,8)6.8
23、方法方法 6.8.1 什么是方法什么是方法 方法包含一系列的代碼塊。從本質(zhì)上來(lái)講,方法就是方法包含一系列的代碼塊。從本質(zhì)上來(lái)講,方法就是和類(lèi)相關(guān)聯(lián)的動(dòng)作,是類(lèi)的外部界面。和類(lèi)相關(guān)聯(lián)的動(dòng)作,是類(lèi)的外部界面。 用戶(hù)可以通過(guò)外部界面來(lái)操作類(lèi)的私有字段。用戶(hù)可以通過(guò)外部界面來(lái)操作類(lèi)的私有字段。6.8.2 方法的定義方法的定義定義方法的基本格式如下:定義方法的基本格式如下: 修飾符修飾符 返回類(lèi)型返回類(lèi)型 方法名方法名(參數(shù)列表參數(shù)列表) /方法的具體實(shí)現(xiàn)方法的具體實(shí)現(xiàn); 6.8.3 方法的返回值方法的返回值 方法可以向調(diào)用方返回某一個(gè)特定的值。如果返回類(lèi)型方法可以向調(diào)用方返回某一個(gè)特定的值。如果返回類(lèi)
24、型不是不是void ,則該方法可以用,則該方法可以用return關(guān)鍵字來(lái)返回值,關(guān)鍵字來(lái)返回值,return 還可以用來(lái)停止方法的執(zhí)行。還可以用來(lái)停止方法的執(zhí)行。 例如,以下類(lèi)例如,以下類(lèi)MyClass3中的中的addnum方法用方法用return關(guān)鍵字關(guān)鍵字來(lái)返回值:來(lái)返回值: public class MyClass3 int num=0; public int addnum(int num1) return num + num1; 6.8.4 方法的參數(shù)方法的參數(shù) 方法中的參數(shù)是保證不同的方法間互動(dòng)的重要橋梁,方方法中的參數(shù)是保證不同的方法間互動(dòng)的重要橋梁,方便用戶(hù)對(duì)數(shù)據(jù)的操作。便用戶(hù)對(duì)
25、數(shù)據(jù)的操作。C#中方法的參數(shù)有中方法的參數(shù)有4種類(lèi)型。種類(lèi)型。1. 值參數(shù)值參數(shù) 不含任何修飾符,當(dāng)利用值向方法傳遞參數(shù)時(shí),編譯程不含任何修飾符,當(dāng)利用值向方法傳遞參數(shù)時(shí),編譯程序給實(shí)參的值做一份拷貝,并且將此拷貝傳遞給該方法,序給實(shí)參的值做一份拷貝,并且將此拷貝傳遞給該方法,被調(diào)用的方法不會(huì)修改內(nèi)存中實(shí)參的值,所以使用值參數(shù)被調(diào)用的方法不會(huì)修改內(nèi)存中實(shí)參的值,所以使用值參數(shù)時(shí)可以保證實(shí)際值的安全性。在調(diào)用方法時(shí),如果形參的時(shí)可以保證實(shí)際值的安全性。在調(diào)用方法時(shí),如果形參的類(lèi)型是值參數(shù)的話,調(diào)用的實(shí)參的表達(dá)式必須保證是正確類(lèi)型是值參數(shù)的話,調(diào)用的實(shí)參的表達(dá)式必須保證是正確的值表達(dá)式。的值表達(dá)式
26、。 例如,前面例如,前面MyClass3類(lèi)中類(lèi)中addnum方法中的參數(shù)就是值方法中的參數(shù)就是值參數(shù)。參數(shù)。2. 引用型參數(shù)引用型參數(shù) 以以ref修飾符聲明的參數(shù)屬引用型參數(shù)。引用型參數(shù)本身修飾符聲明的參數(shù)屬引用型參數(shù)。引用型參數(shù)本身并不創(chuàng)建新的存儲(chǔ)空間,而是將實(shí)參的存儲(chǔ)地址傳遞給形并不創(chuàng)建新的存儲(chǔ)空間,而是將實(shí)參的存儲(chǔ)地址傳遞給形參,所以對(duì)形參的修改會(huì)影響原來(lái)實(shí)參的值。在調(diào)用方法參,所以對(duì)形參的修改會(huì)影響原來(lái)實(shí)參的值。在調(diào)用方法前,引用型實(shí)參必須被初始化,同時(shí)在調(diào)用方法時(shí),對(duì)應(yīng)前,引用型實(shí)參必須被初始化,同時(shí)在調(diào)用方法時(shí),對(duì)應(yīng)引用型參數(shù)的實(shí)參也必須使用引用型參數(shù)的實(shí)參也必須使用ref修飾。修
27、飾。 例如:例如: public class MyClass4 int num=0; public void addnum(int num1,ref int num2) num2=num + num1; class Program static void Main(string args) int x=0; MyClass4 s = new MyClass4(); s.addnum(5, ref x); Console.WriteLine(x);/輸出:輸出:5 引用型參數(shù)引用型參數(shù)3. 輸出參數(shù)輸出參數(shù) 以以out修飾符聲明的參數(shù)屬輸出參數(shù)。與引用型參數(shù)類(lèi)修飾符聲明的參數(shù)屬輸出參數(shù)。與引用型
28、參數(shù)類(lèi)似,輸出型參數(shù)也不開(kāi)辟新的內(nèi)存區(qū)域。它與引用型參數(shù)似,輸出型參數(shù)也不開(kāi)辟新的內(nèi)存區(qū)域。它與引用型參數(shù)的差別在于,調(diào)用方法前無(wú)需對(duì)變量進(jìn)行初始化。輸出型的差別在于,調(diào)用方法前無(wú)需對(duì)變量進(jìn)行初始化。輸出型參數(shù)用于傳遞方法返回的數(shù)據(jù),參數(shù)用于傳遞方法返回的數(shù)據(jù),out修飾符后應(yīng)跟隨與形修飾符后應(yīng)跟隨與形參的類(lèi)型相同的類(lèi)型,用來(lái)聲明在方法返回后傳遞的變量參的類(lèi)型相同的類(lèi)型,用來(lái)聲明在方法返回后傳遞的變量經(jīng)過(guò)了初始化。經(jīng)過(guò)了初始化。 例如:例如:public class MyClass5 int num=0; public void addnum(int num1,out int num2) nu
29、m2=num + num1; class Program static void Main(string args) int x; MyClass5 s = new MyClass5(); s.addnum(5, out x); Console.WriteLine(x);/輸出:輸出:5 輸出型參數(shù)輸出型參數(shù)4. 數(shù)組型參數(shù)數(shù)組型參數(shù) 以以params修飾符聲明的參數(shù)屬數(shù)組型參數(shù)。修飾符聲明的參數(shù)屬數(shù)組型參數(shù)。params關(guān)關(guān)鍵字可以指定在參數(shù)數(shù)目可變處采用參數(shù)的方法參數(shù)。在鍵字可以指定在參數(shù)數(shù)目可變處采用參數(shù)的方法參數(shù)。在方法聲明中的方法聲明中的params關(guān)鍵字之后不允許任何其他參數(shù),關(guān)鍵
30、字之后不允許任何其他參數(shù),并且在方法聲明中只允許一個(gè)并且在方法聲明中只允許一個(gè)params關(guān)鍵字。有數(shù)組型關(guān)鍵字。有數(shù)組型參數(shù)就不能再有參數(shù)就不能再有ref 和和out修飾符。修飾符。 例如:例如:public class MyClass6 int num=10; public void addnum(ref int sum,params int b) sum = num; foreach (int item in b) sum += item; class Program static void Main(string args) int a = new int3 1, 2, 3 ; int
31、 x = 0; MyClass6 s = new MyClass6(); s.addnum(ref x,a); Console.WriteLine(x); 數(shù)組參數(shù)數(shù)組參數(shù)傳遞傳遞2維數(shù)組可不用維數(shù)組可不用params6.8.5 方法的重載方法的重載 方法的重載是指調(diào)用同一方法名,但是使用不同的數(shù)據(jù)類(lèi)型參數(shù)或方法的重載是指調(diào)用同一方法名,但是使用不同的數(shù)據(jù)類(lèi)型參數(shù)或者次序不一致的參數(shù)。只要一個(gè)類(lèi)中有兩個(gè)以上的同名方法,且使用者次序不一致的參數(shù)。只要一個(gè)類(lèi)中有兩個(gè)以上的同名方法,且使用的參數(shù)類(lèi)型或者個(gè)數(shù)不同,編譯器就可以判斷在哪種情況下調(diào)用哪種的參數(shù)類(lèi)型或者個(gè)數(shù)不同,編譯器就可以判斷在哪種情況下
32、調(diào)用哪種方法了。方法了。 為此,為此,C#中引入了中引入了成員簽名成員簽名的概念。成員簽名包含成員的名稱(chēng)和的概念。成員簽名包含成員的名稱(chēng)和參數(shù)列表,每個(gè)成員簽名在類(lèi)型中必須是唯一的,只要成員的參數(shù)列參數(shù)列表,每個(gè)成員簽名在類(lèi)型中必須是唯一的,只要成員的參數(shù)列表不同,成員的名稱(chēng)可以相同。如果同一個(gè)類(lèi)有兩個(gè)或多個(gè)這樣的成表不同,成員的名稱(chēng)可以相同。如果同一個(gè)類(lèi)有兩個(gè)或多個(gè)這樣的成員(方法、屬性、構(gòu)造函數(shù)等),它們具有相同的名稱(chēng)和不同的參數(shù)員(方法、屬性、構(gòu)造函數(shù)等),它們具有相同的名稱(chēng)和不同的參數(shù)列表,則稱(chēng)該同類(lèi)成員進(jìn)行了重載,但它們的成員簽名是不同的。列表,則稱(chēng)該同類(lèi)成員進(jìn)行了重載,但它們的成員
33、簽名是不同的。 例如,下面的代碼實(shí)現(xiàn)了例如,下面的代碼實(shí)現(xiàn)了MethodTest方法的重載(假設(shè)都是某個(gè)方法的重載(假設(shè)都是某個(gè)類(lèi)的成員),它們是不同的成員簽名:類(lèi)的成員),它們是不同的成員簽名: public int MethodTest(int i,int j)/重載方法重載方法1/代碼代碼public int MethodTest(int i) /重載方法重載方法2/代碼代碼public string MethodTest(string sr)/重載方法重載方法3/代碼代碼6.9 索引器索引器6.9.1 什么是索引器什么是索引器 索引器提供了一種訪問(wèn)類(lèi)或結(jié)構(gòu)的方法,即允許按照索引器提供了
34、一種訪問(wèn)類(lèi)或結(jié)構(gòu)的方法,即允許按照與數(shù)組相同的方式對(duì)類(lèi)、結(jié)構(gòu)或接口進(jìn)行索引。它的引入與數(shù)組相同的方式對(duì)類(lèi)、結(jié)構(gòu)或接口進(jìn)行索引。它的引入是為了使程序更加直觀、易于理解。是為了使程序更加直觀、易于理解。 例如,可以有一個(gè)大學(xué)名稱(chēng)類(lèi)例如,可以有一個(gè)大學(xué)名稱(chēng)類(lèi)University,其中有一個(gè),其中有一個(gè)name數(shù)組字段可能包含一些大學(xué)名稱(chēng),數(shù)組字段可能包含一些大學(xué)名稱(chēng),un是該類(lèi)的一個(gè)是該類(lèi)的一個(gè)對(duì)象,類(lèi)中索引器允許訪問(wèn)這些大學(xué)名稱(chēng),例如:對(duì)象,類(lèi)中索引器允許訪問(wèn)這些大學(xué)名稱(chēng),例如: un0 = 清華大學(xué)清華大學(xué); un1 = 北京大學(xué)北京大學(xué); un3 = 武漢大學(xué)武漢大學(xué);6.9.2 定義索引器定
35、義索引器 要聲明類(lèi)或結(jié)構(gòu)上的索引器,需使用要聲明類(lèi)或結(jié)構(gòu)上的索引器,需使用this關(guān)鍵字,其語(yǔ)關(guān)鍵字,其語(yǔ)法格式如下:法格式如下: public int thisint index /索引器聲明索引器聲明 / get和和set訪問(wèn)器訪問(wèn)器 其中,其中,this關(guān)鍵字引用類(lèi)的當(dāng)前實(shí)例。從中看到,索引關(guān)鍵字引用類(lèi)的當(dāng)前實(shí)例。從中看到,索引器像對(duì)普通屬性一樣,為它提供器像對(duì)普通屬性一樣,為它提供get和和set方法,這些訪問(wèn)方法,這些訪問(wèn)器指定當(dāng)使用該索引器時(shí)將引用到什么內(nèi)部成員。器指定當(dāng)使用該索引器時(shí)將引用到什么內(nèi)部成員。例如,帶有索引器的例如,帶有索引器的University類(lèi)設(shè)計(jì)如下:類(lèi)設(shè)計(jì)如
36、下: public class University const int MAX = 5; private string name = new stringMAX; public string thisint index /索引器索引器 get if (index = 0 & index = 0 & index MAX) nameindex = value; 6.10委托委托6.10.1 什么是委托什么是委托 C+、Pascal和其他語(yǔ)言支持函數(shù)指針的概念,允許在和其他語(yǔ)言支持函數(shù)指針的概念,允許在運(yùn)行時(shí)選擇要調(diào)用的函數(shù)。運(yùn)行時(shí)選擇要調(diào)用的函數(shù)。Java不提供任何具有函數(shù)指針不
37、提供任何具有函數(shù)指針功能的結(jié)構(gòu),但功能的結(jié)構(gòu),但C#提供這種構(gòu)造。通過(guò)使用提供這種構(gòu)造。通過(guò)使用Delegate類(lèi),類(lèi),委托實(shí)例可以封裝屬于可調(diào)用實(shí)體的方法。委托實(shí)例可以封裝屬于可調(diào)用實(shí)體的方法。 委托具有以下特點(diǎn):委托具有以下特點(diǎn):l 委托類(lèi)似于委托類(lèi)似于C+函數(shù)指針,但它是類(lèi)型安全的。函數(shù)指針,但它是類(lèi)型安全的。l 委托允許將方法作為參數(shù)進(jìn)行傳遞。委托允許將方法作為參數(shù)進(jìn)行傳遞。l 委托可用于定義回調(diào)方法。委托可用于定義回調(diào)方法。l 委托可以鏈接在一起。例如,可以對(duì)一個(gè)事件調(diào)用多委托可以鏈接在一起。例如,可以對(duì)一個(gè)事件調(diào)用多個(gè)方法。個(gè)方法。l 方法不需要與委托簽名精確匹配。方法不需要與委托
38、簽名精確匹配。委托相當(dāng)于委托相當(dāng)于C/C+中的函數(shù)指針:中的函數(shù)指針:函數(shù)函數(shù)fun1的代碼的代碼函數(shù)函數(shù)fun2的代碼的代碼函數(shù)函數(shù)fun3的代碼的代碼函數(shù)指針函數(shù)指針pfun(*pfun)(.)執(zhí)執(zhí)行行fun1函數(shù)函數(shù)(*pfun)(.)執(zhí)執(zhí)行行fun2函數(shù)函數(shù)(*pfun)(.)執(zhí)執(zhí)行行fun3函數(shù)函數(shù)#include void f1(int x,int y,int &sum) sum=x+y;+x;+y;void f2(int a,int b,int &product) product=a*b;a+=b;b-=a;void main() void (*pf)(int,i
39、nt,int &);/*聲明聲明pf為函數(shù)指針為函數(shù)指針*/int a=2,b=5,c;pf=f1;/*讓讓pf指向函數(shù)指向函數(shù)f1*/(*pf)(a,b,c); /*通過(guò)通過(guò)pf調(diào)用函數(shù)調(diào)用函數(shù)f1*/printf(%d,%d,%dn,a,b,c);pf=f2;/*讓讓pf指向函數(shù)指向函數(shù)f2*/(*pf)(a,b,c); /*通過(guò)通過(guò)pf調(diào)用函數(shù)調(diào)用函數(shù)f2*/printf(%d,%d,%dn,a,b,c);一個(gè)一個(gè)C/C+函數(shù)指針的示例函數(shù)指針的示例6.10.2 定義和使用委托定義和使用委托 定義和使用委托有定義和使用委托有3個(gè)步驟,即聲明、實(shí)例化和調(diào)用。個(gè)步驟,即聲明、實(shí)例化和
40、調(diào)用。1. 聲明委托類(lèi)型聲明委托類(lèi)型 聲明委托類(lèi)型就是告訴編譯器這種類(lèi)型代表了哪種類(lèi)型聲明委托類(lèi)型就是告訴編譯器這種類(lèi)型代表了哪種類(lèi)型的方法。使用以下語(yǔ)法聲明委托類(lèi)型:的方法。使用以下語(yǔ)法聲明委托類(lèi)型: 修飾符修飾符 delegate 返回類(lèi)型返回類(lèi)型 委托類(lèi)型名委托類(lèi)型名(參數(shù)列表參數(shù)列表); 在聲明一個(gè)委托類(lèi)型時(shí),每個(gè)委托類(lèi)型都描述參數(shù)的數(shù)在聲明一個(gè)委托類(lèi)型時(shí),每個(gè)委托類(lèi)型都描述參數(shù)的數(shù)目和類(lèi)型,以及它可以引用的方法的返回類(lèi)型。每當(dāng)需要目和類(lèi)型,以及它可以引用的方法的返回類(lèi)型。每當(dāng)需要一組新的參數(shù)類(lèi)型或新的返回類(lèi)型時(shí),都必須聲明一個(gè)新一組新的參數(shù)類(lèi)型或新的返回類(lèi)型時(shí),都必須聲明一個(gè)新的委托
41、類(lèi)型。的委托類(lèi)型。 例如:例如: private delegate void mydelegate(int n); 上述代碼聲明了一個(gè)委托上述代碼聲明了一個(gè)委托mydelegate,該委托類(lèi)型可以,該委托類(lèi)型可以引用一個(gè)采用引用一個(gè)采用int作為參數(shù)并返回作為參數(shù)并返回void的方法。的方法。2. 實(shí)例化委托實(shí)例化委托 聲明了委托類(lèi)型后,必須創(chuàng)建一個(gè)它的實(shí)例,即創(chuàng)建聲明了委托類(lèi)型后,必須創(chuàng)建一個(gè)它的實(shí)例,即創(chuàng)建委托對(duì)象并使之與特定方法關(guān)聯(lián)。定義委托對(duì)象的語(yǔ)法委托對(duì)象并使之與特定方法關(guān)聯(lián)。定義委托對(duì)象的語(yǔ)法格式如下:格式如下: 委托類(lèi)型名委托類(lèi)型名 委托對(duì)象名委托對(duì)象名; 例如,以下語(yǔ)句創(chuàng)建了例
42、如,以下語(yǔ)句創(chuàng)建了mydelegate委托的一個(gè)委托對(duì)委托的一個(gè)委托對(duì)象象p: mydelegate p;沒(méi)有實(shí)例化沒(méi)有實(shí)例化 另外,委托對(duì)象還需實(shí)例化為調(diào)用的方法,通常將這些方另外,委托對(duì)象還需實(shí)例化為調(diào)用的方法,通常將這些方法放在一個(gè)類(lèi)中(也可以將這些方法放在程序的法放在一個(gè)類(lèi)中(也可以將這些方法放在程序的Program類(lèi)類(lèi)中),假設(shè)一個(gè)中),假設(shè)一個(gè)MyDeClass類(lèi)如下:類(lèi)如下: class MyDeClass public void fun1(int n) Console.WriteLine(0的的2倍倍=1,n,2*n); public void fun2(int n) Cons
43、ole.WriteLine(0的的3倍倍=1, n, 3 * n); 包含委托所指向方法的類(lèi)包含委托所指向方法的類(lèi) 可以通過(guò)以下語(yǔ)句實(shí)例化委托對(duì)象可以通過(guò)以下語(yǔ)句實(shí)例化委托對(duì)象p: MyDeClass obj = new MyDeClass(); mydelegate p = new mydelegate(obj.fun1); 其中,其中,MyDeClass類(lèi)中的類(lèi)中的fun1方法有一個(gè)方法有一個(gè)int形參,其返形參,其返回類(lèi)型為回類(lèi)型為void,它必須與,它必須與mydelegate類(lèi)型的聲明相一致。類(lèi)型的聲明相一致。定義并實(shí)例化定義并實(shí)例化委托對(duì)象委托對(duì)象3. 調(diào)用委托調(diào)用委托 創(chuàng)建委托對(duì)
44、象后,通常將委托對(duì)象傳遞給將調(diào)用該委創(chuàng)建委托對(duì)象后,通常將委托對(duì)象傳遞給將調(diào)用該委托的其他代碼。通過(guò)委托對(duì)象的名稱(chēng)(后面跟著要傳遞托的其他代碼。通過(guò)委托對(duì)象的名稱(chēng)(后面跟著要傳遞給委托的參數(shù),放在括號(hào)內(nèi))調(diào)用委托對(duì)象。其使用語(yǔ)給委托的參數(shù),放在括號(hào)內(nèi))調(diào)用委托對(duì)象。其使用語(yǔ)法格式如下:法格式如下: 委托對(duì)象名委托對(duì)象名(實(shí)參列表實(shí)參列表); 例如,以下語(yǔ)句調(diào)用委托例如,以下語(yǔ)句調(diào)用委托p: p(100); 委托對(duì)象是不可變的,即設(shè)置與它們匹配的簽名后就委托對(duì)象是不可變的,即設(shè)置與它們匹配的簽名后就不能再更改簽名了。但是,如果其他方法具有同一簽名,不能再更改簽名了。但是,如果其他方法具有同一簽名
45、,也可以指向該方法。例如:也可以指向該方法。例如: MyDeClass obj = new MyDeClass(); mydelegate p = new mydelegate(obj.fun1); p(5); p = new mydelegate(obj.fun2); p(3);【例【例6.9】 設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明委托的使用。設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明委托的使用。 using System;namespace Proj6_9 delegate double mydelegate(double x,double y);/聲明委托類(lèi)型聲明委托類(lèi)型 class MyDeClass pu
46、blic double add(double x, double y) return x+y; public double sub(double x,double y) return x-y; public double mul(double x,double y) return x*y; public double div(double x,double y) return x/y; class Program static void Main(string args) MyDeClass obj = new MyDeClass(); mydelegate p = new mydelegat
47、e(obj.add); Console.WriteLine(5+8=0,p(5,8); p = new mydelegate(obj.sub); Console.WriteLine(5-8=0,p(5,8); p = new mydelegate(obj.mul); Console.WriteLine(5*8=0,p(5,8); p = new mydelegate(obj.div); Console.WriteLine(5/8=0,p(5,8); 前面代碼中前面代碼中p作為引用類(lèi)型,也可以改為值類(lèi)型,等價(jià)作為引用類(lèi)型,也可以改為值類(lèi)型,等價(jià)的主函數(shù)可以如下改為:的主函數(shù)可以如下改為: sta
48、tic void Main(string args) MyDeClass obj = new MyDeClass(); mydelegate p = obj.add; Console.WriteLine(5+8=0, p(5, 8); p = obj.sub; Console.WriteLine(5-8=0, p(5, 8); p = obj.mul; Console.WriteLine(5*8=0, p(5, 8); p = obj.div; Console.WriteLine(5/8=0, p(5, 8); 可以直接把方法名賦值可以直接把方法名賦值給委托對(duì)象來(lái)創(chuàng)建一個(gè)給委托對(duì)象來(lái)創(chuàng)建一個(gè)委
49、托實(shí)例委托實(shí)例 6.10.3 委托對(duì)象封裝多個(gè)方法委托對(duì)象封裝多個(gè)方法 委托對(duì)象可以封裝多個(gè)方法,這些方法的集合稱(chēng)為調(diào)用委托對(duì)象可以封裝多個(gè)方法,這些方法的集合稱(chēng)為調(diào)用列表。委托使用列表。委托使用“+”、“-”、“+=”和和“-=”等運(yùn)算符向調(diào)等運(yùn)算符向調(diào)用列表中增加或移除事件處理方法。用列表中增加或移除事件處理方法。 【例【例6.10】 設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明委托對(duì)象封裝設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明委托對(duì)象封裝多個(gè)方法的使用。多個(gè)方法的使用。 using System;namespace Proj6_10 delegate void mydelegate(double x, doubl
50、e y);/聲明委托類(lèi)型聲明委托類(lèi)型 class MyDeClass public void add(double x, double y) Console.WriteLine(0+1=2,x,y,x + y); public void sub(double x, double y) Console.WriteLine(0-1=2, x, y, x - y); public void mul(double x, double y) Console.WriteLine(0*1=2, x, y, x * y); public void div(double x, double y) Console
51、.WriteLine(0/1=2, x, y, x/y); class Program static void Main(string args) MyDeClass obj = new MyDeClass(); mydelegate p, a; a = obj.add; p = a; /將將add方法添加到調(diào)用列表中方法添加到調(diào)用列表中 a = obj.sub; p += a; /將將sub方法添加到調(diào)用列表中方法添加到調(diào)用列表中 a = obj.mul; p += a; /將將mul方法添加到調(diào)用列表中方法添加到調(diào)用列表中 a = obj.div; p += a; /將將div方法添加到調(diào)
52、用列表中方法添加到調(diào)用列表中 p(5, 8); 6.10.4 使委托與匿名方法關(guān)聯(lián)使委托與匿名方法關(guān)聯(lián) 所謂匿名方法就是沒(méi)有方法名稱(chēng)的方法。當(dāng)將委托與匿名所謂匿名方法就是沒(méi)有方法名稱(chēng)的方法。當(dāng)將委托與匿名方法關(guān)聯(lián)時(shí),直接給出方法的函數(shù)體,其一般語(yǔ)法格式如下:方法關(guān)聯(lián)時(shí),直接給出方法的函數(shù)體,其一般語(yǔ)法格式如下: delegate 返回類(lèi)型返回類(lèi)型 委托類(lèi)型名委托類(lèi)型名(參數(shù)列表參數(shù)列表); 委托類(lèi)型名委托類(lèi)型名 委托對(duì)象名委托對(duì)象名=返回類(lèi)型返回類(lèi)型(參數(shù)列表參數(shù)列表) /*匿名方法代碼匿名方法代碼*/ ; 托對(duì)象名托對(duì)象名(實(shí)參列表實(shí)參列表) 第第1個(gè)語(yǔ)句聲明委托類(lèi)型;第個(gè)語(yǔ)句聲明委托類(lèi)型;
53、第2個(gè)語(yǔ)句定義匿名方法并將其個(gè)語(yǔ)句定義匿名方法并將其與委托對(duì)象關(guān)聯(lián);第與委托對(duì)象關(guān)聯(lián);第3個(gè)語(yǔ)句調(diào)用委托。個(gè)語(yǔ)句調(diào)用委托。 例如,以下程序段就是使委托與匿名方法關(guān)聯(lián),并調(diào)用例如,以下程序段就是使委托與匿名方法關(guān)聯(lián),并調(diào)用該委托:該委托: delegate void mydelegate(string mystr); /聲明委托類(lèi)型聲明委托類(lèi)型 class Program static void Main(string args) mydelegate p = delegate(string mystr) Console.WriteLine(mystr); ; p(String);/輸出:輸出:
54、String 6.11事件事件 6.11.1 什么是事件什么是事件 事件是類(lèi)在發(fā)生其關(guān)注的事情時(shí)用來(lái)提供通知的一種方事件是類(lèi)在發(fā)生其關(guān)注的事情時(shí)用來(lái)提供通知的一種方式。例如,封裝用戶(hù)界面控件的類(lèi)可以定義一個(gè)在用戶(hù)單擊式。例如,封裝用戶(hù)界面控件的類(lèi)可以定義一個(gè)在用戶(hù)單擊時(shí)候發(fā)生的一個(gè)事件??丶?lèi)不關(guān)心單擊按鈕時(shí)候發(fā)生了什時(shí)候發(fā)生的一個(gè)事件??丶?lèi)不關(guān)心單擊按鈕時(shí)候發(fā)生了什么,但是它需要告知派生類(lèi)單擊事件已經(jīng)發(fā)生,然后,派生么,但是它需要告知派生類(lèi)單擊事件已經(jīng)發(fā)生,然后,派生類(lèi)可以選擇如何響應(yīng)。類(lèi)可以選擇如何響應(yīng)。 命令按鈕命令按鈕用戶(hù)單擊用戶(hù)單擊引發(fā)執(zhí)行引發(fā)執(zhí)行Click事件過(guò)程事件過(guò)程以課堂講
55、課為例,某教室里有若干學(xué)生,當(dāng)上課教師以課堂講課為例,某教室里有若干學(xué)生,當(dāng)上課教師宣布宣布“開(kāi)始上課開(kāi)始上課”時(shí),本教室里的學(xué)生聽(tīng)到后做各種上課時(shí),本教室里的學(xué)生聽(tīng)到后做各種上課準(zhǔn)備,有的認(rèn)真聽(tīng)課,有的認(rèn)真看書(shū),有的做筆記,而不準(zhǔn)備,有的認(rèn)真聽(tīng)課,有的認(rèn)真看書(shū),有的做筆記,而不在本教室的學(xué)生則不會(huì)。在本教室的學(xué)生則不會(huì)。教師教師開(kāi)始上課開(kāi)始上課學(xué)生學(xué)生做某種動(dòng)作做某種動(dòng)作事件關(guān)聯(lián)事件關(guān)聯(lián)教師類(lèi)教師類(lèi)學(xué)生類(lèi)學(xué)生類(lèi)從程序的角度看,當(dāng)教師宣布從程序的角度看,當(dāng)教師宣布“開(kāi)始上課開(kāi)始上課”時(shí)就是發(fā)時(shí)就是發(fā)生了一個(gè)生了一個(gè)事件事件,是該教師通知該事件發(fā)生,所以該教師是,是該教師通知該事件發(fā)生,所以該教
56、師是事件源,本教室的學(xué)生(稱(chēng)為事件源,本教室的學(xué)生(稱(chēng)為訂閱者訂閱者)接到通知后開(kāi)始做)接到通知后開(kāi)始做上課準(zhǔn)備(事件的訂閱者對(duì)事件的處理)。上課準(zhǔn)備(事件的訂閱者對(duì)事件的處理)。 6.11.2 事件的創(chuàng)建和使用事件的創(chuàng)建和使用 下面介紹在下面介紹在C#中創(chuàng)建和使用事件的步驟。中創(chuàng)建和使用事件的步驟。1. 為事件創(chuàng)建一個(gè)委托類(lèi)型和聲明事件為事件創(chuàng)建一個(gè)委托類(lèi)型和聲明事件 在事件源類(lèi)中聲明一個(gè)事件委托類(lèi)型,該委托類(lèi)型的返回值在事件源類(lèi)中聲明一個(gè)事件委托類(lèi)型,該委托類(lèi)型的返回值類(lèi)型通常為類(lèi)型通常為void。其一般的語(yǔ)法格式如下:。其一般的語(yǔ)法格式如下: delegate void 委托類(lèi)型名委托類(lèi)
57、型名(觸發(fā)事件的對(duì)象名,事件參數(shù)觸發(fā)事件的對(duì)象名,事件參數(shù)); 例如在課堂講課例子中,設(shè)計(jì)事件源類(lèi)為教師類(lèi)例如在課堂講課例子中,設(shè)計(jì)事件源類(lèi)為教師類(lèi)Teacher,其,其中通過(guò)以下語(yǔ)句聲明一個(gè)委托類(lèi)型中通過(guò)以下語(yǔ)句聲明一個(gè)委托類(lèi)型delegateType,其委托的事件,其委托的事件處理方法返回類(lèi)型為處理方法返回類(lèi)型為void,不帶任何參數(shù):,不帶任何參數(shù): public delegate void delegateType();/聲明委托類(lèi)型聲明委托類(lèi)型 事件是事件源類(lèi)的成員。在事件源類(lèi)中以關(guān)鍵字事件是事件源類(lèi)的成員。在事件源類(lèi)中以關(guān)鍵字event聲明聲明一個(gè)事件,其一般語(yǔ)法格式如下:一個(gè)事件
58、,其一般語(yǔ)法格式如下: 修飾符修飾符 event 委托類(lèi)型名委托類(lèi)型名 事件名事件名; 其中,其中,“修飾符修飾符”指出類(lèi)的用戶(hù)訪問(wèn)事件的方式,可以為指出類(lèi)的用戶(hù)訪問(wèn)事件的方式,可以為public、private、protected、internal、protectedinternal、static或或virtual等。等。 例如,在例如,在Teacher類(lèi)包含以下語(yǔ)句聲明一個(gè)上課事件:類(lèi)包含以下語(yǔ)句聲明一個(gè)上課事件: public event delegateType ClassEvent; /聲明一個(gè)上課事件聲明一個(gè)上課事件2. 創(chuàng)建事件處理的方法創(chuàng)建事件處理的方法 當(dāng)事件觸發(fā)時(shí)需要調(diào)用事
59、件處理方法,需設(shè)計(jì)相應(yīng)的事件當(dāng)事件觸發(fā)時(shí)需要調(diào)用事件處理方法,需設(shè)計(jì)相應(yīng)的事件處理方法。既可以將事件處理方法放在訂閱者類(lèi)中,也可以處理方法。既可以將事件處理方法放在訂閱者類(lèi)中,也可以將將事件處理方法放在單獨(dú)的類(lèi)中。將將事件處理方法放在單獨(dú)的類(lèi)中。 例如在課堂講課例子中,設(shè)計(jì)訂閱者類(lèi)為學(xué)生類(lèi)例如在課堂講課例子中,設(shè)計(jì)訂閱者類(lèi)為學(xué)生類(lèi)Student,在該類(lèi)中設(shè)計(jì)以下在該類(lèi)中設(shè)計(jì)以下3個(gè)事件處理方法:個(gè)事件處理方法:public void Listener()/聽(tīng)課方法聽(tīng)課方法 Console.WriteLine( 學(xué)生學(xué)生 + sname + 正在認(rèn)真聽(tīng)課正在認(rèn)真聽(tīng)課); public void
60、Record()/做筆記方法做筆記方法 Console.WriteLine( 學(xué)生學(xué)生 + sname + 正在做筆記正在做筆記); public void Reading()/看書(shū)方法看書(shū)方法 Console.WriteLine( 學(xué)生學(xué)生 + sname + 正在認(rèn)真看書(shū)正在認(rèn)真看書(shū)); 3. 訂閱事件訂閱事件 向事件源類(lèi)的事件中添加事件處理方法中的一個(gè)委托,這向事件源類(lèi)的事件中添加事件處理方法中的一個(gè)委托,這個(gè)過(guò)程稱(chēng)為訂閱事件,這個(gè)過(guò)程通常是在主程序中進(jìn)行的,首個(gè)過(guò)程稱(chēng)為訂閱事件,這個(gè)過(guò)程通常是在主程序中進(jìn)行的,首先必須定義一個(gè)包含事件的類(lèi)的對(duì)象,然后將事件處理方法和先必須定義一個(gè)包含事件的類(lèi)的對(duì)象,然后將事件處理方法和該
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 兼職搭建合同范本
- 車(chē)站租房合同范本
- 銷(xiāo)售臺(tái)布合同范本
- 預(yù)付押金合同范本
- Nor-6α-Oxycodol-生命科學(xué)試劑-MCE
- 科技公司如何通過(guò)網(wǎng)絡(luò)直播提高用戶(hù)參與度?-策略分析與探討
- 科技改變生活基于AI的辦公樓智能安全管理
- 生命教育與心理健康的相互促進(jìn)
- 社交電商行業(yè)教育市場(chǎng)的發(fā)展策略研究
- 社區(qū)文化對(duì)物業(yè)服務(wù)的創(chuàng)新推動(dòng)
- XF-T 3004-2020 汽車(chē)加油加氣站消防安全管理
- 認(rèn)識(shí)辦公室(辦公室管理課件)
- 子宮內(nèi)膜癌保留生育治療
- (正式版)JBT 14660-2024 額定電壓6kV到30kV地下掘進(jìn)設(shè)備用橡皮絕緣軟電纜
- 本科院校-基礎(chǔ)醫(yī)學(xué)-醫(yī)學(xué)細(xì)胞生物學(xué)-第二章 細(xì)胞的概念與分子基礎(chǔ)
- iso37001-2016反賄賂管理手冊(cè)程序文件表單一整套
- 2.2算法的概念及其描述課件人教中圖版高中信息技術(shù)必修1
- 新蘇教版科學(xué)六年級(jí)下冊(cè)全冊(cè)教案(含反思)
- 高速公路橋頭跳車(chē)判別和處治
- 勃利縣大四站鎮(zhèn)侵蝕溝治理工程施工組織設(shè)計(jì)
- 汽車(chē)電子技術(shù)專(zhuān)業(yè)人才培養(yǎng)方案樣本
評(píng)論
0/150
提交評(píng)論