C#的面向?qū)ο蟪绦蛟O(shè)計.ppt_第1頁
C#的面向?qū)ο蟪绦蛟O(shè)計.ppt_第2頁
C#的面向?qū)ο蟪绦蛟O(shè)計.ppt_第3頁
C#的面向?qū)ο蟪绦蛟O(shè)計.ppt_第4頁
C#的面向?qū)ο蟪绦蛟O(shè)計.ppt_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章 C#的面向?qū)ο蟪绦蛟O(shè)計,內(nèi)容提要: 類、對象的概念及使用 方法、屬性、索引的概念、聲明及調(diào)用 構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義 繼承和接口的用法 委托和事件的聲明及調(diào)用 目的要求: 理解類、對象、構(gòu)造函數(shù)和析構(gòu)函數(shù)的意義 掌握方法、屬性、索引的用法 掌握繼承和接口、委托和事件的聲明及調(diào)用 重點(diǎn)難點(diǎn): 類、對象、方法、屬性、繼承、接口、委托和事件,面向?qū)ο蟮某绦蛟O(shè)計( OOP )的主要思想是將數(shù)據(jù)及處 理這些數(shù)據(jù)的操作都封裝到一個稱為類(Class)的數(shù)據(jù)結(jié) 構(gòu)中。使用這個類時,只需要定義一個類的變量即可,這 個變量叫做對象(Object)。通過調(diào)用對象的數(shù)據(jù)成員完 成對類的使用。 1. 類 在

2、面向?qū)ο罄碚撝?,類(class)就是對具有相同特征的一類事物所做的抽象(或者說,歸納)。,6.1 面向?qū)ο蟪绦蛟O(shè)計的基本概念,2. 對象 類是一種抽象,而對象(object)則是實(shí)例(instance), 是具體的。 如果使用如下格式來代表一個類生成一個對象: 類名 對象名; 則: 電子計算機(jī) ComputerA; 電子計算機(jī) ComputerB; 就代表ComputerA和ComputerB是“電子計算機(jī)”類的兩個不同對象。,3. 類的屬性 屬性說明了這個類的特點(diǎn)。 例如“PC計算機(jī)”類則可能具備如下屬性: 計算機(jī)的名稱 CPU類型 內(nèi)存容量 硬盤容量 主板型號 顯示適配器型號 聲卡型號 操

3、作系統(tǒng)類型 通過這些屬性,就可以將不同的PC計算機(jī)區(qū)分開。,3. 類的屬性 屬性說明了這個類的特點(diǎn)。 例如“PC計算機(jī)”類則可能具備如下屬性: 計算機(jī)的名稱 CPU類型 內(nèi)存容量 硬盤容量 主板型號 顯示適配器型號 聲卡型號 操作系統(tǒng)類型 通過這些屬性,就可以將不同的PC計算機(jī)區(qū)分開。,4. 類的方法 類的方法(method)代表了一類事物所具備的動作, 是對屬性的操作。 比如:“石英鐘”類的方法有:秒針前進(jìn)一格、分 針前進(jìn)一格、時針前進(jìn)一格等;而“錄像機(jī)”類所具備 的方法可以有:播放、定格、錄像、倒帶、快進(jìn)等。,5. 派生和繼承 在類的繼承中,被繼承的類稱為基類(又稱為父類), 由基類繼承的

4、類稱為派生類(又稱為子類)。派生類自動獲 得基類的所有屬性和方法,而且可以在派生類中添加新的屬 性和方法。,6. 多態(tài)性 多態(tài)性是指在一般類中定義的屬性或行為,被特殊 類繼承之后,可以具有不同數(shù)據(jù)類型或表現(xiàn)出不同的行 為。就是程序在運(yùn)行時,會自動判斷對象的派生類型, 并調(diào)用相應(yīng)的方法。 7. 封裝 封裝就是把對象的屬性和服務(wù)結(jié)合成一個獨(dú)立的系 統(tǒng)單位,并盡可能隱蔽對象的內(nèi)部細(xì)節(jié)。,6.2 類和對象 6.2.1 類的聲明 類是C#的一種自定義數(shù)據(jù)類型,其聲明格式為: 類修飾符 class 類名:基類類名 類的成員; ; 說明:C#支持的類修飾符有:new、public、protected、 in

5、ternal、private、abstract、sealed。,例:定義一個車輛類(有三個變量) class Vehicle public int passengers; /乘客數(shù) public int fuelcap; /所耗燃料 public int mpg; /每公里耗油量 ,6.2.2 類的成員 類可以分為兩大類:類本身所聲明的,以及 從基類中繼承而來的。 在C中,按照類的成員是否為函數(shù)將其分為兩種: 一種不以函數(shù)形式體現(xiàn),稱為成員變量; 另一種是以函數(shù)形式體現(xiàn),稱為成員函數(shù)。,1. 類成員的訪問修飾符 (1)public: 允許類的內(nèi)部或外界直接訪問; (2)private: 不允許

6、外界訪問,也不允許派生類 訪問,即只能在類的內(nèi)部訪問。如 果沒有設(shè)定訪問修飾符,默認(rèn)為 private; (3)protected: 不允許外界訪問,但允許派生類 訪問; (4)internal: 只有本類的成員才能訪問。 (5)readonly:該成員的值只能讀,不能寫。也就 是說,除了賦予初始值外,在程序 的任何一個部分將無法更改這個成 員的值。,class ClassA public int a; private int b; protected int c; public void SetA( ) a=1; /正確,允許訪問類自身公有成員 b=2; /正確,允許訪問類自身私有成員 c=

7、3; /正確,允許訪問類自身保護(hù)成員 class ClassB:ClassA public void SetB( ) ClassA BaseA=new ClassA( ); BaseA.a=5; /正確,允許訪問基類公有成員 BaseA.b=23; /錯誤,不允許訪問基類私有成員 BaseA.c=68; /正確,允許訪問基類保護(hù)成員 class ClassC public void SetB( ) ClassA BaseA=new ClassA( ); BaseA.a=5; /正確,允許訪問類的其他公有成員 BaseA.b=23; /錯誤,不允許訪問類的其他私有成員 BaseA.c=68; /

8、錯誤,不允許訪問類的其他保護(hù)成員 ,2. 靜態(tài)成員與非靜態(tài)成員 靜態(tài)成員是在聲明成員時在前面加上static保留字; 非靜態(tài)成員是在聲明成員時前面沒有static保留字; 靜態(tài)成員屬于類所有,非靜態(tài)成員屬于類的對象所有。 靜態(tài)成員的訪問格式: 類名.靜態(tài)成員名,若將類中的某個成員聲明為static,則該成員稱為靜態(tài) 成員。類中的成員要么是靜態(tài)的,要么是非靜態(tài)的。 類的非靜態(tài)成員屬于類的實(shí)例所有,每創(chuàng)建一個類的 實(shí)例都在內(nèi)存中為非靜態(tài)成員開辟了一塊區(qū)域。而類的靜 態(tài)成員屬于類所有,為這個類的所有實(shí)例所共享。無論這 個類創(chuàng)建了多少個對象(實(shí)例),一個靜態(tài)成員在內(nèi)存中只占有一塊區(qū)域。,例:靜態(tài)成員的

9、訪問 using System; class Myclass public int nIndex=10; static public double fphi=45.6; class classTest static void Main( ) int a=Myclass.nIndex; /錯誤,因?yàn)閚Index是非靜態(tài)成員 double b= Myclass.fphi; /正確,因?yàn)閒phi是靜態(tài)成員 Console.Write(b); ,6.2.3 對象的聲明 創(chuàng)建類的對象。分兩步: (1)先聲明對象名 格式: 類名 對象名; 例:Vehicle minivan; /定義類Vehicle的一個

10、對象 (2)創(chuàng)建類的實(shí)例。 格式:對象名=new 類名( ); 例:minivan=new Vehicle( ); /創(chuàng)建一個實(shí)例 以上兩步也可以合并成一步。 格式: 類名 對象名=new 類名( ) ; 例: Vehicle minivan =new Vehicle( );,6.3 構(gòu)造函數(shù)和析構(gòu)函數(shù) C#中有兩個特殊的函數(shù):構(gòu)造函數(shù)和析構(gòu)函數(shù)。 構(gòu)造函數(shù):當(dāng)類實(shí)例化時首先執(zhí)行的函數(shù); 析構(gòu)函數(shù):當(dāng)實(shí)例(即對象)從內(nèi)存中銷毀前最后執(zhí)行 的函數(shù)。,6.3.1 構(gòu)造函數(shù),在C#中,當(dāng)創(chuàng)建一個對象時,系統(tǒng)首先為這個對象賦予一個標(biāo)識符,然后給對象分配合適的內(nèi)存空間,隨后系統(tǒng)就自動調(diào)用對象的構(gòu)造函數(shù)。

11、 構(gòu)造函數(shù)的類型修飾符總是public,因?yàn)闃?gòu)造函數(shù)主要是在類外創(chuàng)建對象時自動調(diào)用。 格式: class 類名 public 類名( ) /構(gòu)造函數(shù)體 ,例:using System; class MyClass public int x; public Myclass() /類MyClass的構(gòu)造函數(shù) x=10; class ConsDemo public static void Main() MyClass t1=new MyClass(); MyClass t2=new MyClass(); Console.WriteLine(“0t1”,t1.x, t2.x); ,運(yùn)行結(jié)果如下:,構(gòu)造

12、函數(shù)也可以帶參數(shù)。,例:using System; class Fruit public string color; public string shape; public Fruit(string c,string s) /類Fruit的構(gòu)造函數(shù) color=c; shape=s; class Test public static void Main() Fruit Orange=new Fruit(“orange”,”round”);/創(chuàng)建Orange實(shí)例 Console.WriteLine(“0,1”,Orange.color, Orange.shape); ,運(yùn)行結(jié)果如下:,構(gòu)造函數(shù)也

13、可以重載。 例:using System; class A public int count; public A() count=-1; public A(int n) count=n; class Test static void Main() A a=new A(); Console.WriteLine(count=0,a.count); A b=new A(5); Console.WriteLine(count=0,b.count); ,運(yùn)行結(jié)果如下:,使用 this關(guān)鍵字 C#中的this關(guān)鍵字是用來代表對象自身。this一般用在構(gòu)造函數(shù)中, 以便區(qū)別同名的構(gòu)造函數(shù)參數(shù)和類成員變量。

14、例: using System; class Point int x,y; public Point(int x,int y) this.x=x; this.y=y; ,運(yùn)行結(jié)果如下:,class Test static void Main() Point p=new Point(5,6); Console.WriteLine(x=0,p.x); Console.WriteLine(y=0,p.y); ,6.3.2 析構(gòu)函數(shù),析構(gòu)函數(shù)也是類的特殊的成員函數(shù),它主要用于釋放類實(shí)例。 析構(gòu)函數(shù)的特殊性表現(xiàn)在以下幾個方面: (1)析構(gòu)函數(shù)的名字與類名相同,但它前面需要加一個“”符號; (2)析構(gòu)函數(shù)

15、不能帶參數(shù),也沒有返回值; (3)當(dāng)撤消對象時,自動調(diào)用析構(gòu)函數(shù); (4)析構(gòu)函數(shù)不能被繼承,也不能被重載。,格式: class 類名 類名( ) /析構(gòu)函數(shù)體 析構(gòu)函數(shù)以與構(gòu)造函數(shù)相反的順序被調(diào)用。,例:using System; class Decon1 public Decon1( ) Console.WriteLine(“調(diào)用構(gòu)造函數(shù)Decon1”); Decon1( ) Console.WriteLine(“調(diào)用析構(gòu)函數(shù)Decon1”); class Decon2 public Decon2( ) Console.WriteLine(“調(diào)用構(gòu)造函數(shù)Decon2”); Decon2(

16、) Console.WriteLine(“調(diào)用析構(gòu)函數(shù)Decon2”); class Test public static void Main() Decon1 dec1=new Decon1( ); Decon2 dec2=new Decon2( ); ,運(yùn)行結(jié)果如下:,可以按照程序代碼執(zhí)行的功能或其他依據(jù)把相關(guān)的語句組織在一起,并給它們注明相應(yīng)的名稱,利用這種方式把程序分塊,就形成了類的方法。 方法的功能是通過方法調(diào)用實(shí)現(xiàn)的。方法調(diào)用指定了被調(diào)用方法的名字和調(diào)用方法所需的信息(參數(shù)),調(diào)用方法要求被調(diào)用方法按照方法參數(shù)完成某個任務(wù),并在完成這項任務(wù)后由方法返回。如果調(diào)用過程出錯,則無法完成

17、正常的任務(wù)。,6.4 方法,6.4.1 方法的定義及調(diào)用,方法是類中用于計算或進(jìn)行其他操作的成員。類的方法主要用來操作類的數(shù)據(jù),提供一種訪問數(shù)據(jù)的途徑。 1. 方法的定義 格式: 修飾符 返回值類型 方法名(形式參數(shù)列表) 方法體各語句; ,說明:(1)如果省略“方法修飾符”,該方法為類的 私有成員。 (2)“返回類型”指定該方法返回數(shù)據(jù)的類型, 它可以是任何有效的類型。如果方法不需 要返回一個值,其返回類型必須是void。 (3) “方法參數(shù)列表”是用逗號分隔的類型、 標(biāo)識符對。這里的參數(shù)是形式參數(shù),本質(zhì) 上是一個變量,它用來在調(diào)用方法時接收 傳給方法的實(shí)際參數(shù)值,如果方法沒有參 數(shù),那么參

18、數(shù)列表為空。,2. 從方法返回,一般來說有兩種情況將導(dǎo)致方法返回。 第一種情況:當(dāng)碰到方法的結(jié)束花括號。 第二種情況:執(zhí)行到return語句。 有兩種形式的 return:一種用在void方法中(就是那些沒有返回值的方法),另一種用在有返回值的方法中。,例:通過方法的結(jié)束花括號返回。 using System; class Test public void myMeth( ) int j; for(j=0;j10;j+) if(j%3=0) continue; Console.WriteLine( “0t”,j); static void Main( ) Test lei=new Test(

19、); lei.myMeth( ); ,運(yùn)行結(jié)果如下:,C#允許在一個方法中,有兩個或多個return語句,特別是當(dāng)方法有多個分支時。 例:using System; class Test public void myMeth( ) int j= 8; if(j=5) j=j*2; Console.WriteLine(j ); return; else j=j*3; Console.WriteLine(j ); return; static void Main( ) Test lei=new Test( ); lei.myMeth( ); ,運(yùn)行結(jié)果如下:,注意:一個void方法在下述情況之一下

20、將返回 程序執(zhí)行時碰到方法的結(jié)束花括號;或者程序執(zhí)行 到一條return語句時。 使用下述形式的return語句來從方法返回一個值給調(diào)用者。 格式: return value; 說明:這里value是要從方法中返回的值。,例:用return語句返回值。 public int myMeth( ) int j= 8; if(j=5) return j*2; else return j*3; ,6.4.2 方法的參數(shù)類型 調(diào)用方法時,可以給方法傳遞一個或多個值。 傳給方法的值叫做實(shí)參(argument),在方法內(nèi)部, 接收實(shí)參值的變量叫做形參(parameter),形參在緊 跟著方法名的括號中聲明。

21、形參的聲明語法與變量 的聲明語法一樣。形參只在方法內(nèi)部有效,除了將 接收實(shí)參的值外,它與一般的變量沒什么區(qū)別。 C#方法的參數(shù)類型主要有:值參數(shù)、引用參數(shù) 和輸出參數(shù)。,1值參數(shù) 未用任何修飾符聲明的參數(shù)為值參數(shù)。值 參數(shù)在調(diào)用該參數(shù)所屬的方法成員時創(chuàng)建,并 用調(diào)用中給定的實(shí)參值初始化。當(dāng)從該方法返 回時值參數(shù)被銷毀。對值參數(shù)的修改不會影響 到原自變量。值參數(shù)通過復(fù)制原自變量的值來 初始化。,例:使用值參數(shù)。 using System; class Test public void Swap(int x,int y) int k; k=x; x=y; y=x; static void Main

22、() int a=8, b=68; Console.WriteLine(a=0, b=1, a, b); Test sw=new Test(); sw.Swap(a, b); Console.WriteLine(a=0, b=1, a, b); ,程序的運(yùn)行結(jié)果為: a=8, b=68 a=8, b=68,2. 引用型參數(shù) 用ref修飾符聲明的參數(shù)為引用參數(shù)。引用參數(shù)本身并不創(chuàng)建新的存儲空間,而是將實(shí)參的存儲地址傳遞給形參??梢哉J(rèn)為引用參數(shù)中就是調(diào)用方法時給出的變量,而不是一個新變量。在方法調(diào)用中,引用參數(shù)必須被賦初值。在調(diào)用時,傳送給ref參數(shù)的必須是變量,類型必須相同,并且必須使用ref修

23、飾。 格式: 方法修飾符 返回類型 方法名(,ref 參數(shù)1, ref 參數(shù) 2,) 方法實(shí)現(xiàn)部分; 調(diào)用方法時,實(shí)參前面也必須要加上ref。,例:使用引用參數(shù)。 using System; class Test public void Swap(ref int x,ref int y) int k; k=x; x=y; y=x; static void Main() int a=8, b=68; Console.WriteLine(a=0, y=1, a, b); Test sw=new Test(); sw.Swap(ref a, ref b); Console.WriteLine(a=0

24、, y=1, a, b); ,程序的運(yùn)行結(jié)果為: a=8, b=68 a=68, b=8,3. 輸出參數(shù) 用out修飾符定義的參數(shù)稱為輸出參數(shù)。如果希望方法返回 多個值,可使用輸出參數(shù)。 格式: 方法修飾符 返回類型 方法名(,out 參數(shù)1, out 參數(shù) 2,) 方法實(shí)現(xiàn)部分; 調(diào)用方法時,實(shí)參前面也要加上out。,例:使用輸出參數(shù) using System; class MyClass public string TestOut(out string i) i=使用out關(guān)鍵字; return out參數(shù); class test static void Main() string x;

25、MyClass app=new MyClass(); Console.WriteLine(app.TestOut(out x); Console.WriteLine(x); ,運(yùn)行結(jié)果如下:,例: using System; class TestOut /b就是利用out這個輸出參數(shù)而返回的值 static int OutValue(int a,out char b) b=(char)a; return 9; static void Main() int t=65,r; char m; r=OutValue(t,out m); Console.WriteLine(r=0,m=1,r,m); ,

26、運(yùn)行結(jié)果如下:,注意: 在把引用型實(shí)參的值傳遞給形參之前,必須先對其賦值。這一點(diǎn)是引用參數(shù)與輸出參數(shù)的不同之處。 在帶有引用參數(shù)的方法中,有可能導(dǎo)致多個變量名指向同一內(nèi)存地址,從而導(dǎo)致出錯。,6.4.2 方法的重載,類中兩個以上的方法(包括隱藏的繼承而來的方法)取的名字相同,只要使用的參數(shù)類型或參數(shù)個數(shù)不同,編譯器便知道在何種情況下應(yīng)該調(diào)用哪個方法,這就叫做方法的重載。 方法重載必須遵守一個重要的約束:每一個被重載方法的參數(shù)類型或個數(shù)必須不同。當(dāng)調(diào)用重載方法時,將執(zhí)行形參與實(shí)參相匹配的那個方法。,例:方法重載。 using System; class TestoverLoad public v

27、oid print(int i) Console.WriteLine(輸出的整數(shù)=0,i); public void print(string s) Console.WriteLine(輸出的字符串=0, s); public void print(double d) Console.WriteLine(輸出的雙精度數(shù)=0,d); class test public static void Main( ) TestoverLoad app=new TestoverLoad( ); app.print(6); app.print(理解方法重載了嗎?); app.print(3.14); ,運(yùn)行結(jié)

28、果為: 輸出的整數(shù)=6 輸出的字符串=理解方法重載了嗎? 輸出的雙精度數(shù)=3.14,6.4.4 靜態(tài)方法與非靜態(tài)方法 類的成員類型有靜態(tài)和非靜態(tài)兩種,因此方法也有靜態(tài)方法和非靜態(tài)方法兩種。使用static 修飾符的方法稱為靜態(tài)方法,沒有使用static 修飾符的方法稱為非靜態(tài)方法。 靜態(tài)方法和非靜態(tài)方法的區(qū)別是:靜態(tài)方法屬于類所有,非靜態(tài)方法屬于用該類定義的對象所有。,例:使用靜態(tài)方法和非靜態(tài)方法。 using System; class TestMethod public int a; static public int b; void Fun1( ) /定義一個非靜態(tài)方法 a = 10;

29、/正確,直接訪問非靜態(tài)成員 b = 20; /正確,直接訪問靜態(tài)成員 static void Fun2( ) /定義一個靜態(tài)成員方法 a = 10; /錯誤,不能訪問非靜態(tài)成員 b = 20; /正確,可以訪問靜態(tài)成員,相當(dāng)于myClass.b = 20 class Test static void Main( ) myClass A = new myClass( ); A.a = 10; /正確,訪問類myClass的非靜態(tài)公有成員變量 A.b = 10; /錯誤,不能直接訪問類中靜態(tài)公有成員 MyClass.a = 20; /錯誤,不能通過類訪問類中非靜態(tài)公有成員 MyClass.b =

30、20; /正確,可以通過類訪問類myClass中的 /靜態(tài)公有成員 ,6.4.5 運(yùn)算符的重載,為類定義自己的運(yùn)算符的操作,就稱為運(yùn)算符重載。 1運(yùn)算符重載的聲明 C# 中運(yùn)算符重載總是在類中進(jìn)行聲明。實(shí)際上一個運(yùn)算符重載不過是一個方法罷了,比較特別的是它的名稱需要遵守一個特殊的格式來定義。所有的重載運(yùn)算符的名稱都是以operator開始,加上欲重載的運(yùn)算符,而且重載運(yùn)算符的方法一定是public且為static的。 聲明重載運(yùn)算符的一般格式如下: public static 返回類型 operator 運(yùn)算符(參數(shù)列表) /可執(zhí)行語句 ,C#中下列運(yùn)算符都是可以重載的: 一元運(yùn)算符:+ -

31、! + - true false 二元運(yùn)算符:+ - * / % else return n*F(n-1); ,6.5 屬性 屬性是對現(xiàn)實(shí)世界中實(shí)體特征的抽象,它提供了一種對類或?qū)ο笮再|(zhì)的訪問。不直接操作類的數(shù)據(jù)內(nèi)容,而是通過訪問器進(jìn)行訪問(使用get和set對屬性的值進(jìn)行讀寫)。 由于屬性是表達(dá)事物的狀態(tài)的,屬性的存取方式可以是讀,也可以是寫。讀寫屬性分別用get和set進(jìn)行表示。,6.5 屬性 6.5.1 屬性的聲明 格式: 屬性修飾符 屬性的類型 屬性名稱方法聲明 說明:若屬性是靜態(tài)成員,通過“類名.屬性成員名”訪問;若屬性是非靜態(tài)成員,通過“對象名.屬性成員名”訪問。 通過訪問器,類的

32、屬性成員可以返回一個值(get訪問器),或者接受外界通過賦值語句提供的值(set訪問器)。,get訪問器 格式: get 語句 說明:get訪問器中的語句主要是用return語句返回某一個變量成員的值。 例:class Circle protected int page=2; public int pa get return page; class Test static void Main( ) Circle MyCircle=new Circle( ); int n=MyCircle.pa*10; /讀pa屬性 int m=MyCircle.page*10; /錯誤!Page是protec

33、ted ,set訪問器 格式: set 語句 說明:set訪問器用于外界寫入的值。set訪問器就像帶有一個參數(shù)的方法,這個參數(shù)的名字是value(注意:參數(shù)value是隱含的,不能再定義),它的值就是調(diào)用者要寫入屬性的值。 例:class Circle protected int page; public int pa get return page; set page=value; class Test static void Main( ) Circle MyCircle=new Circle( ); MyCircle.pa=10; / 對pa屬性進(jìn)行寫操作 int n=MyCircle.

34、pa*10; /讀pa屬性 Console.WriteLine(“n=0”,n); ,運(yùn)行結(jié)果如下:,通過屬性來設(shè)置變量成員的值,可以在訪問器中加入代碼,以判斷數(shù)據(jù)的合法性。 例:以下是使用條件運(yùn)算符進(jìn)行運(yùn)算,從而保證類ClassA的nIndex不為負(fù)數(shù)。 class A private int nIndex; public int Index get return nIndex; set nIndex=value=0?value:0; ,class Test static void Main() A p=new A(); p.Index=-9; Console.WriteLine(p.Ind

35、ex); ,運(yùn)行結(jié)果如下:,屬性定義可以包含get和set兩個訪問器的定義,也可以只包含其中的一個。根據(jù)get和set訪問器的存在或不存在,屬性按下面特征進(jìn)行分類: .既包括get訪問器也包括set訪問器的屬性被稱為讀寫 屬性。 .只包括get訪問器的屬性被稱為只讀屬性。一個只讀 屬性被賦值是錯誤的。 .只包括set訪問器的屬性被稱為只寫屬性。,屬性與變量都可以用來表示事物的狀態(tài),但屬性可以實(shí)現(xiàn)只寫或只讀并且可以對用戶指定的值(value)進(jìn)行有效性檢查,從而保證只有正確的狀態(tài)才會得到設(shè)置,而變量不能。所以,在C#中一般采取以下原則: (1)若在類的內(nèi)部記錄事物的狀態(tài)信息,則用變量。 (2)變

36、量一般用private修飾,以防止對外使用。 (3)對外公布事物的狀態(tài)信息,則使用屬性。 (4)屬性一般與某個或某幾個變量有對應(yīng)關(guān)系。,索引器是這樣一個成員:它能夠讓對象以類似數(shù)組的方式來訪問,即可以使對象能用下標(biāo)來得到一個值,它以訪問數(shù)組的方法來訪問類的數(shù)據(jù)成員,而實(shí)際的讀/寫操作則是通過get和set來完成的。 6.6.1 索引的定義與使用 格式: 修飾符 類型名 this參數(shù)列表 set get 說明:在set方法中,可以使用一個特殊變量value,用以表示用戶指定的值,而get方法使用return返回所得到的值。,6.6 索引指示器,例:定義索引指示器,class MyIndexer

37、private string myArray=new string4; public string thisint index get if(index=4) return null; else return myArrayindex; set if(!(index=4) myArrayindex=value; 注意:屬性可以是靜態(tài)成員,而索引指示器只能是實(shí)例成員。,6.6.2 使用索引指示器訪問對象 使用索引指示器,可以像數(shù)組一樣訪問類的對象,只不過通過數(shù)組下標(biāo)訪問的是存儲在數(shù)組中的數(shù)組元素,而索引指示器訪問的是類的對象。 使用“常規(guī)的”C#數(shù)組,下標(biāo)數(shù)字必須是整型值。索引器的一個優(yōu)點(diǎn)就是程

38、序員可以定義整型和非整型兩種下標(biāo)。,例:using System; class Index string name=new stringA,B,C,D; int i; public int thisstring idx get for(i=0;iname.Length;i+) if(idx=namei) break; if(i=name.Length) return -1; else return i+1; static void Main() Index a=new Index(); if(aA!=-1) Console.WriteLine(字符A是序列中的第0個字符,aA); else C

39、onsole.WriteLine(序列中沒有該字符); ,運(yùn)行結(jié)果如下:,委托,顧名思義,就是中間代理人的意思。通俗地說,委托是一個可以引用方法的對象,即是說委托可以調(diào)用它所指向的方法。 事件是建立在委托基礎(chǔ)上的另一個重要特性。從本質(zhì)上說,事件就是當(dāng)某個事情發(fā)生時,會自動去執(zhí)行一些語句。事件是特殊化的委托,委托是事件的基礎(chǔ)。,6.7 委托和事件,6.7.1 委托 C#中使用委托的具體的步驟是: (1) 聲明一個委托,其參數(shù)形式一定要和想要 包含的方法的參數(shù)形式一致。 (2) 定義所有你要定義的方法,其參數(shù)形式和 第一步中聲明的委托對象的參數(shù)形式必須 相同。 (3) 創(chuàng)建委托對象并將所希望的方法

40、包含在該 委托對象中。 (4) 通過委托對象調(diào)用包含在其中的各個方法。,步驟1: 聲明一個委托 格式: 修飾符 delegate 返回類型 委托名(參數(shù)列表); 例: 委托的聲明 public delegate void MyDelegate1(string input); public delegate double MyDelegate2( ); 聲明一個委托的對象,與聲明一個普通類對象的方式一樣: 委托名 委托對象名; 委托對象的聲明。 MyDelegate1 a; MyDelegate2 b;,步驟2:定義方法,其參數(shù)形式和步驟1中聲明的委托對象的必 須相同。例:定義方法 class

41、MyClass1 public void dMethod1(string input) Console.WriteLine(“Method1傳遞的參數(shù)是 0,input); public void dMethod2(string input) Console.WriteLine( Method1傳遞的參數(shù)是 0,input); ,步驟3:創(chuàng)建一個委托對象并將上面的方法包含其中 例:在委托對象中包含方法。 MyClass1 c2=new MyClass1(); MyDelegate1 d1; d1 = new MyDelegate1(c2.dMethod1); MyDelegate1 d2 =

42、new MyDelegate1(c2.dMethod2); 步驟4:通過委托對象調(diào)用包含在其中的方法。 例:調(diào)用委托對象包含的方法。 d1(abc); d2(123);,下面這個例子就是將上面的4個步驟合在一起: using System; public delegate void MyDelegate1(string input); class MyClass1 public void dMethod1(string input) Console.WriteLine(dMethod1傳遞的參數(shù)是 0,input); public void dMethod2(string input) Con

43、sole.WriteLine( dMethod2傳遞的參數(shù)是 0,input); class Driver static void Main() MyClass1 c2=new MyClass1();? MyDelegate1 d1 = new MyDelegate1(c2.dMethod1);? MyDelegate1 d2 = new MyDelegate1(c2.dMethod2);? d1(abc); d2(123); ,運(yùn)行結(jié)果如下:,委托是可以合并的,又稱為多播(Multicast)。合并的委托實(shí)際上是對多個方法的調(diào)用,對這樣的委托的調(diào)用,實(shí)際上是對所包裝的各個方法的全部調(diào)用,其中的多個方法又稱為該委托的調(diào)用列表。 對于多個相同類型的委托,可以用加號運(yùn)算符“+”進(jìn)行調(diào)用列表的合并,可以用減號運(yùn)算符“-”移除其調(diào)用列表中的方法。 委托加減運(yùn)算后的結(jié)果,如果其中不包含方法,則結(jié)果為null。 例: strMod a=new strMod(DelegTest.reSpace); strMod b=new strMod(DelegTest.delSpace); strMod c=a+b; c(“How are you!”); /先調(diào)用reSpace()方法,

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論