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

下載本文檔

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

文檔簡介

會計學(xué)1的面向?qū)ο蟪绦蛟O(shè)計內(nèi)容提要:類、對象的概念及使用方法、屬性、索引的概念、聲明及調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義繼承和接口的用法委托和事件的聲明及調(diào)用目的要求:理解類、對象、構(gòu)造函數(shù)和析構(gòu)函數(shù)的意義

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

面向?qū)ο蟮某绦蛟O(shè)計(OOP)的主要思想是將數(shù)據(jù)及處理這些數(shù)據(jù)的操作都封裝到一個稱為類(Class)的數(shù)據(jù)結(jié)構(gòu)中。使用這個類時,只需要定義一個類的變量即可,這個變量叫做對象(Object)。通過調(diào)用對象的數(shù)據(jù)成員完成對類的使用。

1.類在面向?qū)ο罄碚撝?,類(class)就是對具有相同特征的一類事物所做的抽象(或者說,歸納)。

6.1面向?qū)ο蟪绦蛟O(shè)計的基本概念第2頁/共78頁2.對象類是一種抽象,而對象(object)則是實例(instance),是具體的。

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

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

電子計算機ComputerB;

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

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

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

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

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

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

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

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

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

6.2類和對象

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

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

類的成員;

}[;]

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

internal、private、abstract、sealed。

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

classVehicle{publicintpassengers;//乘客數(shù)

publicintfuelcap;//所耗燃料

publicintmpg;//每公里耗油量

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

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

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

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

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)建一個類的實例都在內(nèi)存中為非靜態(tài)成員開辟了一塊區(qū)域。而類的靜態(tài)成員屬于類所有,為這個類的所有實例所共享。無論這個類創(chuàng)建了多少個對象(實例),一個靜態(tài)成員在內(nè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構(gòu)造函數(shù)和析構(gòu)函數(shù)

C#中有兩個特殊的函數(shù):構(gòu)造函數(shù)和析構(gòu)函數(shù)。

構(gòu)造函數(shù):當(dāng)類實例化時首先執(zhí)行的函數(shù);

析構(gòu)函數(shù):當(dāng)實例(即對象)從內(nèi)存中銷毀前最后執(zhí)行的函數(shù)。第18頁/共78頁6.3.1構(gòu)造函數(shù)

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

{public類名(){//構(gòu)造函數(shù)體

}}第19頁/共78頁

例:usingSystem;classMyClass{publicintx;publicMyclass()//類MyClass的構(gòu)造函數(shù)

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

構(gòu)造函數(shù)也可以帶參數(shù)。

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

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

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

運行結(jié)果如下:第21頁/共78頁

構(gòu)造函數(shù)也可以重載。例: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);}}運行結(jié)果如下:第22頁/共78頁使用this關(guān)鍵字

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

usingSystem;

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

運行結(jié)果如下:

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

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

class類名

{

……~類名(){//析構(gòu)函數(shù)體

}}

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

運行結(jié)果如下:第26頁/共78頁

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

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

1.方法的定義

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

{

方法體各語句;

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

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

標(biāo)識符對。這里的參數(shù)是形式參數(shù),本質(zhì)

上是一個變量,它用來在調(diào)用方法時接收

傳給方法的實際參數(shù)值,如果方法沒有參

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

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

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

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();}}

運行結(jié)果如下:第31頁/共78頁

C#允許在一個方法中,有兩個或多個return語句,特別是當(dāng)方法有多個分支時。例: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();}}運行結(jié)果如下:第32頁/共78頁

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

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

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

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

第34頁/共78頁6.4.2方法的參數(shù)類型

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

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

第35頁/共78頁1.值參數(shù)未用任何修飾符聲明的參數(shù)為值參數(shù)。值參數(shù)在調(diào)用該參數(shù)所屬的方法成員時創(chuàng)建,并用調(diào)用中給定的實參值初始化。當(dāng)從該方法返回時值參數(shù)被銷毀。對值參數(shù)的修改不會影響到原自變量。值參數(shù)通過復(fù)制原自變量的值來初始化。第36頁/共78頁例:使用值參數(shù)。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);}}程序的運行結(jié)果為:

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

格式:

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

2,…]){

方法實現(xiàn)部分;

}

調(diào)用方法時,實參前面也必須要加上ref。第38頁/共78頁例:使用引用參數(shù)。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);}}程序的運行結(jié)果為:

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

格式:

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

2,…]){

方法實現(xiàn)部分;

}

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

{

publicstringTestOut(outstringi) {

i="使用out關(guān)鍵字";

return"out參數(shù)"; }

}classtest

{

staticvoidMain() {

stringx; MyClassapp=newMyClass();

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

Console.WriteLine(x); }

}

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

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

運行結(jié)果如下:第42頁/共78頁

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

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

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

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

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

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

輸出的字符串=理解方法重載了嗎?輸出的雙精度數(shù)=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)成員,相當(dāng)于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運算符(參數(shù)列表){//可執(zhí)行語句

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

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

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

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

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

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

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

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

6.5屬性屬性是對現(xiàn)實世界中實體特征的抽象,它提供了一種對類或?qū)ο笮再|(zhì)的訪問。不直接操作類的數(shù)據(jù)內(nèi)容,而是通過訪問器進行訪問(使用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訪問器就像帶有一個參數(shù)的方法,這個參數(shù)的名字是value(注意:參數(shù)value是隱含的,不能再定義),它的值就是調(diào)用者要寫入屬性的值。

例: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);}}

運行結(jié)果如下:第56頁/共78頁

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

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

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

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

運行結(jié)果如下:第57頁/共78頁

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

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

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

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

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

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

6.6.1索引的定義與使用

格式:修飾符類型名this[參數(shù)列表]{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使用索引指示器訪問對象

使用索引指示器,可以像數(shù)組一樣訪問類的對象,只不過通過數(shù)組下標(biāo)訪問的是存儲在數(shù)組中的數(shù)組元素,而索引指示器訪問的是類的對象。使用“常規(guī)的”C#數(shù)組,下標(biāo)數(shù)字必須是整型值。索引器的一個優(yōu)點就是程序員可以定義整型和非整型兩種下標(biāo)。第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("序列中沒有該字符"); }}

運行結(jié)果如下:第63頁/共78頁

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

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

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

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

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

格式:

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

例:

委托的聲明

publicdelegatevoidMyDelegate1(stringinput);

publicdelegatedoubleMyDelegate2();

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

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

例:定義方法classMyClass1{

publicvoiddMethod1(stringinput){

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

}

publicvoiddMethod2(stringinput){

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

}

第67頁/共78頁

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

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

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

例:調(diào)用委托對象包含的方法。

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

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

publicvoiddMethod1(stringinput)

{

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

}publicvoiddMethod2(stringinput)

{

Console.WriteLine("dMethod2傳遞的參數(shù)是{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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論