版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度環(huán)保項目大額借款協(xié)議及環(huán)境監(jiān)測合同3篇
- 2025版苗木采購與園林景觀施工一體化服務(wù)合同4篇
- 二零二五年度標(biāo)準(zhǔn)公司租賃合同范本2篇
- 2025年度鋼構(gòu)工程后期維護保養(yǎng)合同范本2篇
- 二零二五版農(nóng)村房屋買賣糾紛仲裁合同4篇
- 2025年度內(nèi)參報告撰寫與行業(yè)研究合同4篇
- 2025年山地承包及森林資源可持續(xù)利用合同4篇
- 2025年度個人貸款合同變更條款模板2篇
- 二零二五年度木材產(chǎn)業(yè)園區(qū)建設(shè)投資合同4篇
- 男性生殖系統(tǒng)健康知識
- 護理服務(wù)在產(chǎn)科中的應(yīng)用課件
- 流行文化對青少年價值觀的影響研究
- 2024年代理記賬工作總結(jié)6篇
- 電氣工程預(yù)算實例:清單與計價樣本
- VOC廢氣治理工程中電化學(xué)氧化技術(shù)的研究與應(yīng)用
- 煤礦機電設(shè)備培訓(xùn)課件
- 科技論文圖表等規(guī)范表達
- 高考寫作指導(dǎo)議論文標(biāo)準(zhǔn)語段寫作課件32張
- 2021年普通高等學(xué)校招生全國英語統(tǒng)一考試模擬演練八省聯(lián)考解析
- 紅色研學(xué)旅行課程的設(shè)計與實踐
- 幼兒園保育教育質(zhì)量指南評估指標(biāo)考核試題及答案
評論
0/150
提交評論