的面向對象程序設計_第1頁
的面向對象程序設計_第2頁
的面向對象程序設計_第3頁
的面向對象程序設計_第4頁
的面向對象程序設計_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學1的面向對象程序設計內容提要:類、對象的概念及使用方法、屬性、索引的概念、聲明及調用構造函數和析構函數的定義繼承和接口的用法委托和事件的聲明及調用目的要求:理解類、對象、構造函數和析構函數的意義

掌握方法、屬性、索引的用法掌握繼承和接口、委托和事件的聲明及調用重點難點:類、對象、方法、屬性、繼承、接口、委托和事件第1頁/共78頁

面向對象的程序設計(OOP)的主要思想是將數據及處理這些數據的操作都封裝到一個稱為類(Class)的數據結構中。使用這個類時,只需要定義一個類的變量即可,這個變量叫做對象(Object)。通過調用對象的數據成員完成對類的使用。

1.類在面向對象理論中,類(class)就是對具有相同特征的一類事物所做的抽象(或者說,歸納)。

6.1面向對象程序設計的基本概念第2頁/共78頁2.對象類是一種抽象,而對象(object)則是實例(instance),是具體的。

如果使用如下格式來代表一個類生成一個對象:

類名對象名;則:電子計算機ComputerA;

電子計算機ComputerB;

就代表ComputerA和ComputerB是“電子計算機”類的兩個不同對象。第3頁/共78頁3.類的屬性屬性說明了這個類的特點。例如“PC計算機”類則可能具備如下屬性:計算機的名稱

CPU類型內存容量硬盤容量主板型號顯示適配器型號聲卡型號操作系統(tǒng)類型通過這些屬性,就可以將不同的PC計算機區(qū)分開。第4頁/共78頁3.類的屬性屬性說明了這個類的特點。例如“PC計算機”類則可能具備如下屬性:計算機的名稱

CPU類型內存容量硬盤容量主板型號顯示適配器型號聲卡型號操作系統(tǒng)類型通過這些屬性,就可以將不同的PC計算機區(qū)分開。第5頁/共78頁

4.類的方法類的方法(method)代表了一類事物所具備的動作,是對屬性的操作。

比如:“石英鐘”類的方法有:秒針前進一格、分針前進一格、時針前進一格等;而“錄像機”類所具備的方法可以有:播放、定格、錄像、倒帶、快進等。

第6頁/共78頁5.派生和繼承

在類的繼承中,被繼承的類稱為基類(又稱為父類),由基類繼承的類稱為派生類(又稱為子類)。派生類自動獲得基類的所有屬性和方法,而且可以在派生類中添加新的屬性和方法。

第7頁/共78頁6.多態(tài)性多態(tài)性是指在一般類中定義的屬性或行為,被特殊類繼承之后,可以具有不同數據類型或表現出不同的行為。就是程序在運行時,會自動判斷對象的派生類型,并調用相應的方法。

7.封裝封裝就是把對象的屬性和服務結合成一個獨立的系統(tǒng)單位,并盡可能隱蔽對象的內部細節(jié)。第8頁/共78頁

6.2類和對象

6.2.1類的聲明類是C#的一種自定義數據類型,其聲明格式為:

[類修飾符]class類名[:基類類名]{

類的成員;

}[;]

說明:C#支持的類修飾符有:new、public、protected、

internal、private、abstract、sealed。

第9頁/共78頁例:定義一個車輛類(有三個變量)

classVehicle{publicintpassengers;//乘客數

publicintfuelcap;//所耗燃料

publicintmpg;//每公里耗油量

}第10頁/共78頁6.2.2類的成員

類可以分為兩大類:類本身所聲明的,以及從基類中繼承而來的。在C#中,按照類的成員是否為函數將其分為兩種:一種不以函數形式體現,稱為成員變量;另一種是以函數形式體現,稱為成員函數。

第11頁/共78頁1.類成員的訪問修飾符

(1)public:允許類的內部或外界直接訪問;(2)private:不允許外界訪問,也不允許派生類訪問,即只能在類的內部訪問。如果沒有設定訪問修飾符,默認為

private;(3)protected:不允許外界訪問,但允許派生類訪問;(4)internal:只有本類的成員才能訪問。(5)readonly:該成員的值只能讀,不能寫。也就是說,除了賦予初始值外,在程序的任何一個部分將無法更改這個成員的值。

第12頁/共78頁classClassA{publicinta;privateintb;protectedintc;publicvoidSetA(){a=1;//正確,允許訪問類自身公有成員

b=2;//正確,允許訪問類自身私有成員

c=3;//正確,允許訪問類自身保護成員

}}classClassB:ClassA{publicvoidSetB(){ClassABaseA=newClassA();BaseA.a=5;//正確,允許訪問基類公有成員

BaseA.b=23;//錯誤,不允許訪問基類私有成員

BaseA.c=68;//正確,允許訪問基類保護成員

}}classClassC{publicvoidSetB(){ClassABaseA=newClassA();BaseA.a=5;//正確,允許訪問類的其他公有成員

BaseA.b=23;//錯誤,不允許訪問類的其他私有成員

BaseA.c=68;//錯誤,不允許訪問類的其他保護成員

}}第13頁/共78頁2.靜態(tài)成員與非靜態(tài)成員靜態(tài)成員是在聲明成員時在前面加上static保留字;非靜態(tài)成員是在聲明成員時前面沒有static保留字;靜態(tài)成員屬于類所有,非靜態(tài)成員屬于類的對象所有。

靜態(tài)成員的訪問格式:

類名.靜態(tài)成員名第14頁/共78頁

若將類中的某個成員聲明為static,則該成員稱為靜態(tài)成員。類中的成員要么是靜態(tài)的,要么是非靜態(tài)的。

類的非靜態(tài)成員屬于類的實例所有,每創(chuàng)建一個類的實例都在內存中為非靜態(tài)成員開辟了一塊區(qū)域。而類的靜態(tài)成員屬于類所有,為這個類的所有實例所共享。無論這個類創(chuàng)建了多少個對象(實例),一個靜態(tài)成員在內存中只占有一塊區(qū)域。第15頁/共78頁例:靜態(tài)成員的訪問usingSystem;classMyclass{publicintnIndex=10;staticpublicdoublefphi=45.6;}classclassTest{staticvoidMain(){inta=Myclass.nIndex;//錯誤,因為nIndex是非靜態(tài)成員

doubleb=Myclass.fphi;//正確,因為fphi是靜態(tài)成員

Console.Write(b);}}第16頁/共78頁6.2.3對象的聲明創(chuàng)建類的對象。分兩步:(1)先聲明對象名

格式:類名對象名;例:Vehicleminivan;//定義類Vehicle的一個對象(2)創(chuàng)建類的實例。

格式:對象名=new類名();

例:minivan=newVehicle();//創(chuàng)建一個實例以上兩步也可以合并成一步。格式:類名對象名=new類名();例:Vehicleminivan=newVehicle();第17頁/共78頁6.3構造函數和析構函數

C#中有兩個特殊的函數:構造函數和析構函數。

構造函數:當類實例化時首先執(zhí)行的函數;

析構函數:當實例(即對象)從內存中銷毀前最后執(zhí)行的函數。第18頁/共78頁6.3.1構造函數

在C#中,當創(chuàng)建一個對象時,系統(tǒng)首先為這個對象賦予一個標識符,然后給對象分配合適的內存空間,隨后系統(tǒng)就自動調用對象的構造函數。構造函數的類型修飾符總是public,因為構造函數主要是在類外創(chuàng)建對象時自動調用。格式:class類名

{public類名(){//構造函數體

}}第19頁/共78頁

例:usingSystem;classMyClass{publicintx;publicMyclass()//類MyClass的構造函數

{x=10;}}classConsDemo{publicstaticvoidMain(){MyClasst1=newMyClass();MyClasst2=newMyClass();Console.WriteLine(“{0}\t{1}”,t1.x,t2.x);}}運行結果如下:第20頁/共78頁

構造函數也可以帶參數。

例:usingSystem;classFruit{publicstringcolor;publicstringshape;publicFruit(stringc,strings)//類Fruit的構造函數

{color=c;shape=s;}}classTest{publicstaticvoidMain(){FruitOrange=newFruit(“orange”,”round”);//創(chuàng)建Orange實例

Console.WriteLine(“{0},{1}”,Orange.color,Orange.shape);}}

運行結果如下:第21頁/共78頁

構造函數也可以重載。例:usingSystem;classA{ publicintcount; publicA() { count=-1; } publicA(intn) { count=n; }}classTest{ staticvoidMain() { Aa=newA();Console.WriteLine("count={0}",a.count); Ab=newA(5); Console.WriteLine("count={0}",b.count);}}運行結果如下:第22頁/共78頁使用this關鍵字

C#中的this關鍵字是用來代表對象自身。this一般用在構造函數中,以便區(qū)別同名的構造函數參數和類成員變量。例:

usingSystem;

classPoint{intx,y;publicPoint(intx,inty){this.x=x;this.y=y;}}

運行結果如下:

classTest{ staticvoidMain() { Pointp=newPoint(5,6); Console.WriteLine("x={0}",p.x); Console.WriteLine("y={0}",p.y); }}第23頁/共78頁6.3.2析構函數

析構函數也是類的特殊的成員函數,它主要用于釋放類實例。析構函數的特殊性表現在以下幾個方面:(1)析構函數的名字與類名相同,但它前面需要加一個“~”符號;(2)析構函數不能帶參數,也沒有返回值;(3)當撤消對象時,自動調用析構函數;(4)析構函數不能被繼承,也不能被重載。第24頁/共78頁格式:

class類名

{

……~類名(){//析構函數體

}}

析構函數以與構造函數相反的順序被調用。第25頁/共78頁例:usingSystem;classDecon1{publicDecon1(){Console.WriteLine(“調用構造函數Decon1”);}~Decon1(){Console.WriteLine(“調用析構函數Decon1”);}}classDecon2{publicDecon2(){Console.WriteLine(“調用構造函數Decon2”);}~Decon2(){Console.WriteLine(“調用析構函數Decon2”);}}classTest{publicstaticvoidMain(){Decon1dec1=newDecon1();Decon2dec2=newDecon2();}}

運行結果如下:第26頁/共78頁

可以按照程序代碼執(zhí)行的功能或其他依據把相關的語句組織在一起,并給它們注明相應的名稱,利用這種方式把程序分塊,就形成了類的方法。方法的功能是通過方法調用實現的。方法調用指定了被調用方法的名字和調用方法所需的信息(參數),調用方法要求被調用方法按照方法參數完成某個任務,并在完成這項任務后由方法返回。如果調用過程出錯,則無法完成正常的任務。6.4方法第27頁/共78頁6.4.1方法的定義及調用

方法是類中用于計算或進行其他操作的成員。類的方法主要用來操作類的數據,提供一種訪問數據的途徑。

1.方法的定義

格式:修飾符返回值類型方法名(形式參數列表)

{

方法體各語句;

}第28頁/共78頁說明:(1)如果省略“方法修飾符”,該方法為類的

私有成員。(2)“返回類型”指定該方法返回數據的類型,它可以是任何有效的類型。如果方法不需要返回一個值,其返回類型必須是void。(3)“方法參數列表”是用逗號分隔的類型、

標識符對。這里的參數是形式參數,本質

上是一個變量,它用來在調用方法時接收

傳給方法的實際參數值,如果方法沒有參

數,那么參數列表為空。第29頁/共78頁2.從方法返回

一般來說有兩種情況將導致方法返回。第一種情況:當碰到方法的結束花括號。第二種情況:執(zhí)行到return語句。有兩種形式的return:一種用在void方法中(就是那些沒有返回值的方法),另一種用在有返回值的方法中。

第30頁/共78頁例:通過方法的結束花括號返回。

usingSystem;classTest{publicvoidmyMeth(){intj;for(j=0;j<10;j++){if(j%3==0)continue;Console.WriteLine(“{0}\t”,j);}}staticvoidMain(){Testlei=newTest();lei.myMeth();}}

運行結果如下:第31頁/共78頁

C#允許在一個方法中,有兩個或多個return語句,特別是當方法有多個分支時。例:usingSystem;classTest{publicvoidmyMeth(){intj=8;if(j>=5){j=j*2;Console.WriteLine(j);return;}else{j=j*3;Console.WriteLine(j);return;}}staticvoidMain(){Testlei=newTest();lei.myMeth();}}運行結果如下:第32頁/共78頁

注意:一個void方法在下述情況之一下將返回程序執(zhí)行時碰到方法的結束花括號;或者程序執(zhí)行到一條return語句時。使用下述形式的return語句來從方法返回一個值給調用者。格式:

returnvalue;說明:這里value是要從方法中返回的值。

第33頁/共78頁例:用return語句返回值。

publicintmyMeth(){intj=8;if(j>=5){returnj*2;}else{returnj*3;}}

第34頁/共78頁6.4.2方法的參數類型

調用方法時,可以給方法傳遞一個或多個值。傳給方法的值叫做實參(argument),在方法內部,接收實參值的變量叫做形參(parameter),形參在緊跟著方法名的括號中聲明。形參的聲明語法與變量的聲明語法一樣。形參只在方法內部有效,除了將接收實參的值外,它與一般的變量沒什么區(qū)別。

C#方法的參數類型主要有:值參數、引用參數和輸出參數。

第35頁/共78頁1.值參數未用任何修飾符聲明的參數為值參數。值參數在調用該參數所屬的方法成員時創(chuàng)建,并用調用中給定的實參值初始化。當從該方法返回時值參數被銷毀。對值參數的修改不會影響到原自變量。值參數通過復制原自變量的值來初始化。第36頁/共78頁例:使用值參數。usingSystem;classTest{publicvoidSwap(intx,inty){intk;k=x;x=y;y=x;}staticvoidMain(){inta=8,b=68;Console.WriteLine("a={0},b={1}",a,b);Testsw=newTest();sw.Swap(a,b);Console.WriteLine("a={0},b={1}",a,b);}}程序的運行結果為:

a=8,b=68a=8,b=68第37頁/共78頁2.引用型參數用ref修飾符聲明的參數為引用參數。引用參數本身并不創(chuàng)建新的存儲空間,而是將實參的存儲地址傳遞給形參。可以認為引用參數中就是調用方法時給出的變量,而不是一個新變量。在方法調用中,引用參數必須被賦初值。在調用時,傳送給ref參數的必須是變量,類型必須相同,并且必須使用ref修飾。

格式:

方法修飾符返回類型方法名([…,]ref參數1[,ref參數

2,…]){

方法實現部分;

}

調用方法時,實參前面也必須要加上ref。第38頁/共78頁例:使用引用參數。usingSystem;classTest{publicvoidSwap(refintx,refinty){intk;k=x;x=y;y=x;}staticvoidMain(){inta=8,b=68;Console.WriteLine("a={0},y={1}",a,b);Testsw=newTest();sw.Swap(refa,refb);Console.WriteLine("a={0},y={1}",a,b);}}程序的運行結果為:

a=8,b=68a=68,b=8第39頁/共78頁3.輸出參數用out修飾符定義的參數稱為輸出參數。如果希望方法返回多個值,可使用輸出參數。

格式:

方法修飾符返回類型方法名([…,]out參數1[,out參數

2,…]){

方法實現部分;

}

調用方法時,實參前面也要加上out。第40頁/共78頁例:使用輸出參數usingSystem;classMyClass

{

publicstringTestOut(outstringi) {

i="使用out關鍵字";

return"out參數"; }

}classtest

{

staticvoidMain() {

stringx; MyClassapp=newMyClass();

Console.WriteLine(app.TestOut(outx));

Console.WriteLine(x); }

}

運行結果如下:第41頁/共78頁例:usingSystem;classTestOut{//b就是利用out這個輸出參數而返回的值

staticintOutValue(inta,outcharb) { b=(char)a; return9; } staticvoidMain() { intt=65,r; charm; r=OutValue(t,outm); Console.WriteLine("r={0},m={1}",r,m); }}

運行結果如下:第42頁/共78頁

注意:在把引用型實參的值傳遞給形參之前,必須先對其賦值。這一點是引用參數與輸出參數的不同之處。在帶有引用參數的方法中,有可能導致多個變量名指向同一內存地址,從而導致出錯。第43頁/共78頁6.4.2方法的重載

類中兩個以上的方法(包括隱藏的繼承而來的方法)取的名字相同,只要使用的參數類型或參數個數不同,編譯器便知道在何種情況下應該調用哪個方法,這就叫做方法的重載。

方法重載必須遵守一個重要的約束:每一個被重載方法的參數類型或個數必須不同。當調用重載方法時,將執(zhí)行形參與實參相匹配的那個方法。

第44頁/共78頁例:方法重載。

usingSystem;classTestoverLoad{publicvoidprint(inti){Console.WriteLine("輸出的整數={0}",i);}publicvoidprint(strings){Console.WriteLine("輸出的字符串={0}",s);}publicvoidprint(doubled){Console.WriteLine("輸出的雙精度數={0}",d);}}classtest{publicstaticvoidMain(){TestoverLoadapp=newTestoverLoad();app.print(6);app.print("理解方法重載了嗎?");

app.print(3.14);}}運行結果為:輸出的整數=6

輸出的字符串=理解方法重載了嗎?輸出的雙精度數=3.14第45頁/共78頁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)方法屬于用該類定義的對象所有。

第46頁/共78頁例:使用靜態(tài)方法和非靜態(tài)方法。

usingSystem;classTestMethod{publicinta;staticpublicintb;voidFun1()//定義一個非靜態(tài)方法

{a=10;//正確,直接訪問非靜態(tài)成員

b=20;//正確,直接訪問靜態(tài)成員

}staticvoidFun2()//定義一個靜態(tài)成員方法

{a=10;//錯誤,不能訪問非靜態(tài)成員

b=20;//正確,可以訪問靜態(tài)成員,相當于myClass.b=20}}classTest{staticvoidMain(){myClassA=newmyClass();A.a=10;//正確,訪問類myClass的非靜態(tài)公有成員變量

A.b=10;//錯誤,不能直接訪問類中靜態(tài)公有成員

MyClass.a=20;//錯誤,不能通過類訪問類中非靜態(tài)公有成員

MyClass.b=20;//正確,可以通過類訪問類myClass中的

//靜態(tài)公有成員

}}第47頁/共78頁6.4.5運算符的重載為類定義自己的運算符的操作,就稱為運算符重載。1.運算符重載的聲明

C#中運算符重載總是在類中進行聲明。實際上一個運算符重載不過是一個方法罷了,比較特別的是它的名稱需要遵守一個特殊的格式來定義。所有的重載運算符的名稱都是以operator開始,加上欲重載的運算符,而且重載運算符的方法一定是public且為static的。

聲明重載運算符的一般格式如下:

publicstatic返回類型operator運算符(參數列表){//可執(zhí)行語句

}第48頁/共78頁C#中下列運算符都是可以重載的:一元運算符:+-!~++--truefalse

二元運算符:+-*/%&|^<<>>==!=><>=<=

其中,比較運算符重載必須成對出現,如果重載==,也必須重載!=,反之亦然,對于>和<,以及<=和>=同樣如此。同樣,true與false也必須成對出現。C#中還有一些運算符是允許重載的,如下所示:

=&&?:newtypeofsizeofis第49頁/共78頁2.一元運算符重載

一元運算符重載必須使用類T的單個參數,其中+、-、!可以返回任何類型;++或--的返回類型必須是類T,而且重載之后的++或--無法區(qū)分前綴與后綴;true和false要求返回類型是布爾類型。3.二元運算符重載二元運算符重載必須有兩個參數,而且其中至少一個必須是聲明運算符的類類型。一個二元運算符可以返回任何類型。第50頁/共78頁6.4.6遞歸

類的方法成員間允許相互調用,也可以自己調用自己。類的方法如果在方法體內直接或間接地自己調用自己就稱為遞歸方法。遞歸是常用的程序設計技術,其基本思想就是“自己調用自己”。遞歸方法實際上體現了“依此類推”、“用同樣的步驟重復”這樣的思想,它可以用簡單的程序來解決某些復雜的計算問題。遞歸調用在完成階乘運算、級數運算、冪指數運算等方面特別有效。在執(zhí)行遞歸操作時,C#語言把遞歸過程中的信息保存在堆棧中。如果無限循環(huán)地遞歸,或者遞歸次數太多,則產生“堆棧溢出”錯誤。第51頁/共78頁

例:用遞歸方法求階乘。利用的數學公式為n!=n*(n-1)!。當n=0時,n!=1。代碼如下:

publiclongF(longn){if(n==0||n==1)return1;elsereturnn*F(n-1);}第52頁/共78頁

6.5屬性屬性是對現實世界中實體特征的抽象,它提供了一種對類或對象性質的訪問。不直接操作類的數據內容,而是通過訪問器進行訪問(使用get和set對屬性的值進行讀寫)。

由于屬性是表達事物的狀態(tài)的,屬性的存取方式可以是讀,也可以是寫。讀寫屬性分別用get和set進行表示。

第53頁/共78頁6.5屬性6.5.1屬性的聲明格式:

[屬性修飾符]屬性的類型屬性名稱{方法聲明}

說明:若屬性是靜態(tài)成員,通過“類名.屬性成員名”訪問;若屬性是非靜態(tài)成員,通過“對象名.屬性成員名”訪問。通過訪問器,類的屬性成員可以返回一個值(get訪問器),或者接受外界通過賦值語句提供的值(set訪問器)。第54頁/共78頁get訪問器格式:

get{語句}

說明:get訪問器中的語句主要是用return語句返回某一個變量成員的值。

例:classCircle{protectedintpage=2;publicintpa{get{returnpage;}}}classTest{staticvoidMain(){CircleMyCircle=newCircle();intn=MyCircle.pa*10;//讀pa屬性

intm=MyCircle.page*10;//錯誤!Page是protected}}第55頁/共78頁

set訪問器格式:

set{語句}

說明:set訪問器用于外界寫入的值。set訪問器就像帶有一個參數的方法,這個參數的名字是value(注意:參數value是隱含的,不能再定義),它的值就是調用者要寫入屬性的值。

例:classCircle{protectedintpage;publicintpa{get{returnpage;}set{page=value;}}}classTest{staticvoidMain(){CircleMyCircle=newCircle();MyCircle.pa=10;//對pa屬性進行寫操作

intn=MyCircle.pa*10;//讀pa屬性

Console.WriteLine(“n={0}”,n);}}

運行結果如下:第56頁/共78頁

通過屬性來設置變量成員的值,可以在訪問器中加入代碼,以判斷數據的合法性。

例:以下是使用條件運算符進行運算,從而保證類ClassA的nIndex不為負數。

classA{privateintnIndex;publicintIndex{get{returnnIndex;}set{nIndex=value>=0?value:0;}}}

classTest{staticvoidMain(){Ap=newA();p.Index=-9; Console.WriteLine(p.Index);}}

運行結果如下:第57頁/共78頁

屬性定義可以包含get和set兩個訪問器的定義,也可以只包含其中的一個。根據get和set訪問器的存在或不存在,屬性按下面特征進行分類:

.既包括get訪問器也包括set訪問器的屬性被稱為讀寫屬性。

.只包括get訪問器的屬性被稱為只讀屬性。一個只讀屬性被賦值是錯誤的。

.只包括set訪問器的屬性被稱為只寫屬性。第58頁/共78頁

屬性與變量都可以用來表示事物的狀態(tài),但屬性可以實現只寫或只讀并且可以對用戶指定的值(value)進行有效性檢查,從而保證只有正確的狀態(tài)才會得到設置,而變量不能。所以,在C#中一般采取以下原則:(1)若在類的內部記錄事物的狀態(tài)信息,則用變量。(2)變量一般用private修飾,以防止對外使用。(3)對外公布事物的狀態(tài)信息,則使用屬性。(4)屬性一般與某個或某幾個變量有對應關系。第59頁/共78頁

索引器是這樣一個成員:它能夠讓對象以類似數組的方式來訪問,即可以使對象能用下標來得到一個值,它以訪問數組的方法來訪問類的數據成員,而實際的讀/寫操作則是通過get和set來完成的。

6.6.1索引的定義與使用

格式:修飾符類型名this[參數列表]{set{}get{}}

說明:在set方法中,可以使用一個特殊變量value,用以表示用戶指定的值,而get方法使用return返回所得到的值。

6.6索引指示器第60頁/共78頁例:定義索引指示器classMyIndexer{privatestring[]myArray=newstring[4];publicstringthis[intindex]{get{if(index<0||index>=4) returnnull;else returnmyArray[index];}set{if(!(index<0||index>=4)) myArray[index]=value;}}注意:屬性可以是靜態(tài)成員,而索引指示器只能是實例成員。第61頁/共78頁

6.6.2使用索引指示器訪問對象

使用索引指示器,可以像數組一樣訪問類的對象,只不過通過數組下標訪問的是存儲在數組中的數組元素,而索引指示器訪問的是類的對象。使用“常規(guī)的”C#數組,下標數字必須是整型值。索引器的一個優(yōu)點就是程序員可以定義整型和非整型兩種下標。第62頁/共78頁例:usingSystem;classIndex{ string[]name=newstring[]{"A","B","C","D"}; inti; publicintthis[stringidx] {get {for(i=0;i<name.Length;i++) { if(idx==name[i]) break; } if(i==name.Length) return-1; else returni+1; }}staticvoidMain() {Indexa=newIndex(); if(a["A"]!=-1) Console.WriteLine("字符A是序列中的第{0}個字符",a["A"]); else Console.WriteLine("序列中沒有該字符"); }}

運行結果如下:第63頁/共78頁

委托,顧名思義,就是中間代理人的意思。通俗地說,委托是一個可以引用方法的對象,即是說委托可以調用它所指向的方法。事件是建立在委托基礎上的另一個重要特性。從本質上說,事件就是當某個事情發(fā)生時,會自動去執(zhí)行一些語句。事件是特殊化的委托,委托是事件的基礎。6.7委托和事件第64頁/共78頁6.7.1委托

C#中使用委托的具體的步驟是:(1)聲明一個委托,其參數形式一定要和想要包含的方法的參數形式一致。

(2)定義所有你要定義的方法,其參數形式和第一步中聲明的委托對象的參數形式必須相同。

(3)創(chuàng)建委托對象并將所希望的方法包含在該委托對象中。(4)通過委托對象調用包含在其中的各個方法。

第65頁/共78頁步驟1:聲明一個委托

格式:

[修飾符]delegate返回類型委托名(參數列表);

例:

委托的聲明

publicdelegatevoidMyDelegate1(stringinput);

publicdelegatedoubleMyDelegate2();

聲明一個委托的對象,與聲明一個普通類對象的方式一樣:委托名委托對象名;委托對象的聲明。

MyDelegate1a;MyDelegate2b;第66頁/共78頁步驟2:定義方法,其參數形式和步驟1中聲明的委托對象的必須相同。

例:定義方法classMyClass1{

publicvoiddMethod1(stringinput){

Console.WriteLine(“Method1傳遞的參數是{0}",input);

}

publicvoiddMethod2(stringinput){

Console.WriteLine(Method1傳遞的參數是{0}",input);}

}

第67頁/共78頁

步驟3:創(chuàng)建一個委托對象并將上面的方法包含其中

例:在委托對象中包含方法。

MyClass1c2=newMyClass1();MyDelegate1d1;d1=newMyDelegate1(c2.dMethod1);MyDelegate1d2=newMyDelegate1(c2.dMethod2);步驟4:通過委托對象調用包含在其中的方法。

例:調用委托對象包含的方法。

d1("abc");d2("123");

第68頁/共78頁下面這個例子就是將上面的4個步驟合在一起:usingSystem;publicdelegatevoidMyDelegate1(stringinput);classMyClass1{

publicvoiddMethod1(stringinput)

{

Console.WriteLine("dMethod1傳遞的參數是{0}",input);

}publicvoiddMethod2(stringinput)

{

Console.WriteLine("dMethod2傳遞的參數是{0}",input);

} }classDriver{

staticvoidMain(){

MyClass1c2=newMyClass1();?

MyDelegate1d1=newMyDelegate1(c2.dMethod1);?

MyDelegate1d2=newMyDelegate1(c2.dMethod2);?

d1("abc");

d2("123");

}

}

溫馨提示

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

評論

0/150

提交評論