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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

如果使用如下格式來(lái)代表一個(gè)類(lèi)生成一個(gè)對(duì)象:

類(lèi)名對(duì)象名;則:電子計(jì)算機(jī)ComputerA;

電子計(jì)算機(jī)ComputerB;

就代表ComputerA和ComputerB是“電子計(jì)算機(jī)”類(lèi)的兩個(gè)不同對(duì)象。第3頁(yè)/共78頁(yè)3.類(lèi)的屬性屬性說(shuō)明了這個(gè)類(lèi)的特點(diǎn)。例如“PC計(jì)算機(jī)”類(lèi)則可能具備如下屬性:計(jì)算機(jī)的名稱(chēng)

CPU類(lèi)型內(nèi)存容量硬盤(pán)容量主板型號(hào)顯示適配器型號(hào)聲卡型號(hào)操作系統(tǒng)類(lèi)型通過(guò)這些屬性,就可以將不同的PC計(jì)算機(jī)區(qū)分開(kāi)。第4頁(yè)/共78頁(yè)3.類(lèi)的屬性屬性說(shuō)明了這個(gè)類(lèi)的特點(diǎn)。例如“PC計(jì)算機(jī)”類(lèi)則可能具備如下屬性:計(jì)算機(jī)的名稱(chēng)

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

4.類(lèi)的方法類(lèi)的方法(method)代表了一類(lèi)事物所具備的動(dòng)作,是對(duì)屬性的操作。

比如:“石英鐘”類(lèi)的方法有:秒針前進(jìn)一格、分針前進(jìn)一格、時(shí)針前進(jìn)一格等;而“錄像機(jī)”類(lèi)所具備的方法可以有:播放、定格、錄像、倒帶、快進(jìn)等。

第6頁(yè)/共78頁(yè)5.派生和繼承

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

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

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

6.2類(lèi)和對(duì)象

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

[類(lèi)修飾符]class類(lèi)名[:基類(lèi)類(lèi)名]{

類(lèi)的成員;

}[;]

說(shuō)明:C#支持的類(lèi)修飾符有:new、public、protected、

internal、private、abstract、sealed。

第9頁(yè)/共78頁(yè)例:定義一個(gè)車(chē)輛類(lèi)(有三個(gè)變量)

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

publicintfuelcap;//所耗燃料

publicintmpg;//每公里耗油量

}第10頁(yè)/共78頁(yè)6.2.2類(lèi)的成員

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

第11頁(yè)/共78頁(yè)1.類(lèi)成員的訪問(wèn)修飾符

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

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

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

b=2;//正確,允許訪問(wèn)類(lèi)自身私有成員

c=3;//正確,允許訪問(wèn)類(lèi)自身保護(hù)成員

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

BaseA.b=23;//錯(cuò)誤,不允許訪問(wèn)基類(lèi)私有成員

BaseA.c=68;//正確,允許訪問(wèn)基類(lèi)保護(hù)成員

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

BaseA.b=23;//錯(cuò)誤,不允許訪問(wèn)類(lèi)的其他私有成員

BaseA.c=68;//錯(cuò)誤,不允許訪問(wèn)類(lèi)的其他保護(hù)成員

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

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

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

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

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

doubleb=Myclass.fphi;//正確,因?yàn)閒phi是靜態(tài)成員

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

格式:類(lèi)名對(duì)象名;例:Vehicleminivan;//定義類(lèi)Vehicle的一個(gè)對(duì)象(2)創(chuàng)建類(lèi)的實(shí)例。

格式:對(duì)象名=new類(lèi)名();

例:minivan=newVehicle();//創(chuàng)建一個(gè)實(shí)例以上兩步也可以合并成一步。格式:類(lèi)名對(duì)象名=new類(lèi)名();例:Vehicleminivan=newVehicle();第17頁(yè)/共78頁(yè)6.3構(gòu)造函數(shù)和析構(gòu)函數(shù)

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

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

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

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

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

}}第19頁(yè)/共78頁(yè)

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

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

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

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

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

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

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

構(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);}}運(yùn)行結(jié)果如下:第22頁(yè)/共78頁(yè)使用this關(guān)鍵字

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

usingSystem;

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

運(yùn)行結(jié)果如下:

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

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

class類(lèi)名

{

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

}}

析構(gòu)函數(shù)以與構(gòu)造函數(shù)相反的順序被調(diào)用。第25頁(yè)/共78頁(yè)例: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();}}

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

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

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

1.方法的定義

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

{

方法體各語(yǔ)句;

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

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

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

上是一個(gè)變量,它用來(lái)在調(diào)用方法時(shí)接收

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

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

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

第30頁(yè)/共78頁(yè)例:通過(guò)方法的結(jié)束花括號(hào)返回。

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

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

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

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

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

第33頁(yè)/共78頁(yè)例:用return語(yǔ)句返回值。

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

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

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

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

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

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

格式:

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

2,…]){

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

}

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

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

格式:

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

2,…]){

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

}

調(diào)用方法時(shí),實(shí)參前面也要加上out。第40頁(yè)/共78頁(yè)例:使用輸出參數(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); }

}

運(yùn)行結(jié)果如下:第41頁(yè)/共78頁(yè)例:usingSystem;classTestOut{//b就是利用out這個(gè)輸出參數(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); }}

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

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

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

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

第44頁(yè)/共78頁(yè)例:方法重載。

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);}}運(yùn)行結(jié)果為:輸出的整數(shù)=6

輸出的字符串=理解方法重載了嗎?輸出的雙精度數(shù)=3.14第45頁(yè)/共78頁(yè)6.4.4靜態(tài)方法與非靜態(tài)方法

類(lèi)的成員類(lèi)型有靜態(tài)和非靜態(tài)兩種,因此方法也有靜態(tài)方法和非靜態(tài)方法兩種。使用static修飾符的方法稱(chēng)為靜態(tài)方法,沒(méi)有使用static修飾符的方法稱(chēng)為非靜態(tài)方法。靜態(tài)方法和非靜態(tài)方法的區(qū)別是:靜態(tài)方法屬于類(lèi)所有,非靜態(tài)方法屬于用該類(lèi)定義的對(duì)象所有。

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

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

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

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

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

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

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

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

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

MyClass.b=20;//正確,可以通過(guò)類(lèi)訪問(wèn)類(lèi)myClass中的

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

}}第47頁(yè)/共78頁(yè)6.4.5運(yùn)算符的重載為類(lèi)定義自己的運(yùn)算符的操作,就稱(chēng)為運(yùn)算符重載。1.運(yùn)算符重載的聲明

C#中運(yùn)算符重載總是在類(lèi)中進(jìn)行聲明。實(shí)際上一個(gè)運(yùn)算符重載不過(guò)是一個(gè)方法罷了,比較特別的是它的名稱(chēng)需要遵守一個(gè)特殊的格式來(lái)定義。所有的重載運(yùn)算符的名稱(chēng)都是以operator開(kāi)始,加上欲重載的運(yùn)算符,而且重載運(yùn)算符的方法一定是public且為static的。

聲明重載運(yùn)算符的一般格式如下:

publicstatic返回類(lèi)型operator運(yùn)算符(參數(shù)列表){//可執(zhí)行語(yǔ)句

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

二元運(yùn)算符:+-*/%&|^<<>>==!=><>=<=

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

=&&?:newtypeofsizeofis第49頁(yè)/共78頁(yè)2.一元運(yùn)算符重載

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

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

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

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

6.5屬性屬性是對(duì)現(xiàn)實(shí)世界中實(shí)體特征的抽象,它提供了一種對(duì)類(lèi)或?qū)ο笮再|(zhì)的訪問(wèn)。不直接操作類(lèi)的數(shù)據(jù)內(nèi)容,而是通過(guò)訪問(wèn)器進(jìn)行訪問(wèn)(使用get和set對(duì)屬性的值進(jìn)行讀寫(xiě))。

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

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

[屬性修飾符]屬性的類(lèi)型屬性名稱(chēng){方法聲明}

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

get{語(yǔ)句}

說(shuō)明:get訪問(wèn)器中的語(yǔ)句主要是用return語(yǔ)句返回某一個(gè)變量成員的值。

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

intm=MyCircle.page*10;//錯(cuò)誤!Page是protected}}第55頁(yè)/共78頁(yè)

set訪問(wèn)器格式:

set{語(yǔ)句}

說(shuō)明:set訪問(wèn)器用于外界寫(xiě)入的值。set訪問(wèn)器就像帶有一個(gè)參數(shù)的方法,這個(gè)參數(shù)的名字是value(注意:參數(shù)value是隱含的,不能再定義),它的值就是調(diào)用者要寫(xiě)入屬性的值。

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

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

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

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

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

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

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

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

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

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

.既包括get訪問(wèn)器也包括set訪問(wèn)器的屬性被稱(chēng)為讀寫(xiě)屬性。

.只包括get訪問(wèn)器的屬性被稱(chēng)為只讀屬性。一個(gè)只讀屬性被賦值是錯(cuò)誤的。

.只包括set訪問(wèn)器的屬性被稱(chēng)為只寫(xiě)屬性。第58頁(yè)/共78頁(yè)

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

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

6.6.1索引的定義與使用

格式:修飾符類(lèi)型名this[參數(shù)列表]{set{}get{}}

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

6.6索引指示器第60頁(yè)/共78頁(yè)例:定義索引指示器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)成員,而索引指示器只能是實(shí)例成員。第61頁(yè)/共78頁(yè)

6.6.2使用索引指示器訪問(wèn)對(duì)象

使用索引指示器,可以像數(shù)組一樣訪問(wèn)類(lèi)的對(duì)象,只不過(guò)通過(guò)數(shù)組下標(biāo)訪問(wèn)的是存儲(chǔ)在數(shù)組中的數(shù)組元素,而索引指示器訪問(wèn)的是類(lèi)的對(duì)象。使用“常規(guī)的”C#數(shù)組,下標(biāo)數(shù)字必須是整型值。索引器的一個(gè)優(yōu)點(diǎn)就是程序員可以定義整型和非整型兩種下標(biāo)。第62頁(yè)/共78頁(yè)例: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}個(gè)字符",a["A"]); else Console.WriteLine("序列中沒(méi)有該字符"); }}

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

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

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

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

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

第65頁(yè)/共78頁(yè)步驟1:聲明一個(gè)委托

格式:

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

例:

委托的聲明

publicdelegatevoidMyDelegate1(stringinput);

publicdelegatedoubleMyDelegate2();

聲明一個(gè)委托的對(duì)象,與聲明一個(gè)普通類(lèi)對(duì)象的方式一樣:委托名委托對(duì)象名;委托對(duì)象的聲明。

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

例:定義方法classMyClass1{

publicvoiddMethod1(stringinput){

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

}

publicvoiddMethod2(stringinput){

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

}

第67頁(yè)/共78頁(yè)

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

例:在委托對(duì)象中包含方法。

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

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

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

第68頁(yè)/共78頁(yè)下面這個(gè)例子就是將上面的4個(gè)步驟合在一起: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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論