Chapter6+(C#面向?qū)ο蟪绦蛟O(shè)計(jì))_第1頁(yè)
Chapter6+(C#面向?qū)ο蟪绦蛟O(shè)計(jì))_第2頁(yè)
Chapter6+(C#面向?qū)ο蟪绦蛟O(shè)計(jì))_第3頁(yè)
Chapter6+(C#面向?qū)ο蟪绦蛟O(shè)計(jì))_第4頁(yè)
Chapter6+(C#面向?qū)ο蟪绦蛟O(shè)計(jì))_第5頁(yè)
已閱讀5頁(yè),還剩68頁(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)介

第6+章

C#面向?qū)ο蟪绦蛟O(shè)計(jì)本章包含的內(nèi)容:1)類

2)對(duì)象3)參數(shù)傳遞4)繼承5)重載、重寫(xiě)和隱藏

6)索引器7)委托8)事件9)運(yùn)算符重載10)類的轉(zhuǎn)換第6’章

VisualC#語(yǔ)言基礎(chǔ)本章重點(diǎn):1)掌握C#中類聲明和對(duì)象定義方法;

2)掌握C#中類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的設(shè)計(jì)方法

;

3)掌握C#中類的靜態(tài)成員的設(shè)計(jì)方法;

4)掌握C#中類屬性和方法的設(shè)計(jì)方法;

5)掌握C#中索引器的設(shè)計(jì)方法;

6)掌握C#中委托的設(shè)計(jì)方法;

7)掌握C#中事件的設(shè)計(jì)方法;

8)掌握C#中運(yùn)算符重載的設(shè)計(jì)方法;

9)掌握C#中類的轉(zhuǎn)換方法。6+.1類

從計(jì)算機(jī)語(yǔ)言的角度,類是一種數(shù)據(jù)類型,對(duì)象是具有這種類型的變量。6.1.1類的聲明聲明格式:[類的修飾符]class類名[:基類名]{//類的成員;

};類的修飾符:public、abstract、sealed、internal。6+.1類

public:公有類,表示對(duì)該類的訪問(wèn)不受限制abstract:抽象類,不能建立該類的實(shí)例sealed:密封類,不允許從該類派生新的類internal:內(nèi)部類,只有其所在類才能訪問(wèn)(類只能在當(dāng)前項(xiàng)目中訪問(wèn))默認(rèn)的訪問(wèn)修飾符為internal6+.1類

6.1.2類的成員字段:存儲(chǔ)數(shù)據(jù),亦稱為數(shù)據(jù)成員。屬性:是類中可以像類中的字段一樣被訪問(wèn)的方法??梢詾轭愖侄翁峁┍Wo(hù),避免字段在對(duì)象不知道的情況下被更改。方法:類可以執(zhí)行的操作。事件:向其他對(duì)象提供有關(guān)事件發(fā)生通知的一種方式。索引器:允許以類似數(shù)組的方式為對(duì)象建立索引。運(yùn)算符:構(gòu)造函數(shù):析構(gòu)函數(shù):6+.1類

類成員的訪問(wèn)修飾符:

public、private、protected、internal、readonly。readonly:只讀成員,這類成員的值只能讀不能寫(xiě)。也就是說(shuō),除了賦初值外,將不能修改該成員的值C#中類聲明和C++有一個(gè)明顯的差別是字段可以賦初值。6+.1類

1、數(shù)據(jù)成員

包括字段、常量和事件語(yǔ)法:[訪問(wèn)修飾符]數(shù)據(jù)類型成員名例:publicclass

student{privateintsno;privatestringsname;privatestringsex=“男”;conststringstate=“中國(guó)”;}6+.1類

2、屬性成員

屬性是字段的一種自然擴(kuò)展。與字段不同的是:屬性不表示存儲(chǔ)位置。屬性擁有訪問(wèn)器。

訪問(wèn)器定義了讀取或者寫(xiě)入屬性值時(shí)必須執(zhí)行的代碼。

屬性更充分體現(xiàn)了對(duì)象的封裝性,屬性不直接操作類的字段,而是通過(guò)訪問(wèn)器進(jìn)行訪問(wèn)。6+.1類

通過(guò)get()和set()訪問(wèn)器來(lái)實(shí)現(xiàn)對(duì)類的私有字段的讀寫(xiě)操作。定義屬性成員的語(yǔ)法:[訪問(wèn)修飾符]數(shù)據(jù)類型屬性名{get{}set{}

}

修飾符有new、public、protected、internal、private、static、virtual、override和abstract。屬性是通過(guò)訪問(wèn)器實(shí)現(xiàn)的。訪問(wèn)器是字段賦值和檢索其值的特殊方法。Set訪問(wèn)器為字段賦值;get訪問(wèn)器檢索字段的值。6+.1類

例:classstudent{privatestringname_;publicstringname{get{returnname_;}set{name_=value;}}};6+.1類

例:usingSystemNamespaceprj{publicclassTpoint{intx,y;publicintpx{get{returnx;}set{x=value;}}publicintpy{get{returny;}set{y=value;}}};classProgram{staticvoidMain(string[]

args){Tpointp=newTpoint();p.px=3;p.py=4;Console.WriteLine(“點(diǎn)=>({0},{1}”,p.px,p.py);}}}6+.1類

3、方法成員……6+.1類

4、構(gòu)造函數(shù)與C++相同5、析構(gòu)函數(shù)與C++相同6+.1類

例:定義一個(gè)包含構(gòu)造函數(shù)的Point類,表示平面上的點(diǎn)坐標(biāo)。classPoint{publicintX{get;set;}publicintY{get;set;}publicPoint()

{X=0;Y=2;

}publicPoint(intx,inty)

{X=x;Y=y;}

};6+.1類

classProgram

{staticvoidMain(string[]args)

{PointobjPoint=newPoint();Console.WriteLine("x={0}",objPoint.X);Console.WriteLine("y={0}",objPoint.Y);PointobjPoint2=newPoint(80,90);Console.WriteLine("x={0}",objPoint2.X);Console.WriteLine("y={0}",objPoint2.Y);

}

};6+.1類

6+.1類

例:classPoint{privateintx;privateinty;publicintX{get{returnx;}set{x=value;}}publicintY{get{returny;}set{y=value;}}6+.1類

publicPoint()

{x=0;y=2;

}publicPoint(intx1,inty1)

{x=x1;y=y1;}publicvoidPrint(){console.WriteLine(“坐標(biāo)({0},{1})”,x,y);}

};6+.1類

classProgram

{staticvoidMain(string[]args)

{PointobjPoint=newPoint();objPoint.Print();objPoint.X=3;objPoint.Y=4;objPoint.Print();PointobjPoint2=newPoint(80,90);objPoint.Print();

intm,n;m=objPoint2.X;n=objPoint2.Y;console.WriteLine(“m={0},n={1}”,m,n);}

};6+.1類

6+.1類

6、靜態(tài)成員包括靜態(tài)字段和靜態(tài)方法。(1)靜態(tài)字段與c++相同(2)靜態(tài)方法與c++相同6+.1類

6.1.3分部類分部類可以將類的聲明拆分到多個(gè)原文件中,被拆分類的每一部分定義的前邊都要用partial關(guān)鍵字修飾,并且分部類的每一部分都可以放在不同的文件中。

例:

在一個(gè)文件中publicpartialclassperson{publicvoidDowork(){//定義方法}};6+.1類

②在另一個(gè)文件中

publicpartialclassperson{publicvoidGoToLunch(){//定義方法}};6+.1類

③在第三個(gè)文件中

publicpartialclassperson{publicvoidDoRest();//定義分部方法};④在第三個(gè)文件中

publicpartialclassperson{publicvoidDoRest();//實(shí)現(xiàn)分部方法{//定義方法}};6+.2對(duì)象

6.2.1定義類的對(duì)象1)定義對(duì)象引用類名對(duì)象名;例:Personp;2)創(chuàng)建類的實(shí)例

對(duì)象名=new類名();

例:p=newPerson();通常將對(duì)象引用和對(duì)象實(shí)例合用,甚至通稱為對(duì)象,但應(yīng)該了解他們的差異。

上述語(yǔ)句:Person()創(chuàng)建類的實(shí)例,然后傳遞回對(duì)該對(duì)象的引用并賦給p。定義對(duì)象引用和創(chuàng)建實(shí)例的過(guò)程可以合并。

例:Personp=newPerson();6+.2對(duì)象

6.2.2訪問(wèn)對(duì)象的字段及屬性

對(duì)象名.字段名6.2.3調(diào)用對(duì)象的方法

對(duì)象名.方法名(參數(shù)列表)6+.3參數(shù)傳遞

C#中方法的參數(shù)有4種類型。1.值參數(shù)

值傳遞是C#默認(rèn)的傳遞方式,使用值傳遞方式時(shí),向形式參數(shù)(形參)傳遞的是實(shí)在參數(shù)(實(shí)參)的副本。方法內(nèi)發(fā)生的對(duì)形參的更改對(duì)實(shí)參本身沒(méi)有影響。2.引用型參數(shù)引用型參數(shù)本身不創(chuàng)造新的存儲(chǔ)空間,而是把實(shí)參的地址傳給形參。形參和實(shí)參指向同一存儲(chǔ)單元,對(duì)形參的改變就是對(duì)實(shí)參的改變。引用型參數(shù)的實(shí)參和形參都必須使用ref修飾。6+.3參數(shù)傳遞

例:PublicclassMyclass{publicvoidaddnum(intnum1,refintnum2){num2=num2+num1;}};ClassProgram{staticvoidMain(string[]args){intx=0;Myclasss=newMyclass();s.addnum(5,refx);Console.WriteLine(x);}};6+.8參數(shù)傳遞

3.輸出參數(shù)與引用型參數(shù)類似,輸出參數(shù)本身也不創(chuàng)造新的存儲(chǔ)空間。它與引用類型參數(shù)的差別在于,調(diào)用方法前無(wú)需對(duì)變量(作為輸出實(shí)參)進(jìn)行初始化。它用于傳遞方法返回的數(shù)據(jù)。輸出型參數(shù)的實(shí)參和形參都必須使用out修飾。6+.3參數(shù)傳遞

例:PublicclassMyclass{intnum=0;publicvoidaddnum(intnum1,outintnum2){num2=num+num1;}};ClassProgram{staticvoidMain(string[]args){intx=8;Myclasss=newMyclass();s.addnum(5,outx);Console.WriteLine(x);}};6+.3參數(shù)傳遞

例(思考)PublicclassMyclass{intnum=0;publicvoidaddnum(intnum1,outintnum2){num2=num1+num2;}};ClassProgram{staticvoidMain(string[]args){intx=8;Myclasss=newMyclass();s.addnum(5,outx);Console.WriteLine(x);}};6+.3參數(shù)傳遞

例(思考)PublicclassMyclass{intnum=0;publicvoidaddnum(intnum1,outintnum2){num2=num+num1;num2=num1+num2;}};ClassProgram{staticvoidMain(string[]args){intx=8;Myclasss=newMyclass();s.addnum(5,outx);Console.WriteLine(x);}};6+.3參數(shù)傳遞

4.數(shù)組型參數(shù)以params修飾符聲明的參數(shù)屬數(shù)組型參數(shù)。在方法聲明中的params關(guān)鍵字之后不允許任何其他參數(shù),并且在方法聲明中只允許一個(gè)params關(guān)鍵字。有數(shù)組型參數(shù)就不能再有ref和out修飾符。6+.3參數(shù)傳遞

例:publicclassMyclass{intnum=10;publicvoidaddnum(refintsum,paramsint[]b){sum=num;foreach(intiteminb)sum+=item;}};classProgram{staticvoidMain(string[]args){int[]a=newint[3]{1,2,3};intx=0;Myclasss=newMyclass();s.addnum(refx,a);Console.WriteLine(x);

}};6+.4繼承

通過(guò)繼承創(chuàng)建派生類的語(yǔ)法:<訪問(wèn)修飾符>class派生類名:基類名{//類的代碼}注意:C#中只能單繼承,不能多繼承。6+.5重載、重寫(xiě)和隱藏

6+.5.1重載

指在同一類中方法的名字相同,但使用不同的數(shù)據(jù)類型參數(shù)或者次序不一致的參數(shù)。classPoint{intadd();intadd(intx,inty);};

與C++相同。6+.5重載、重寫(xiě)和隱藏

6+.5.2重寫(xiě)

指在派生類中編寫(xiě)有相同名稱和參數(shù)的方法。也就是說(shuō),重寫(xiě)是指派生類中的方法與基類中的方法具有相同的簽名。1、virtual關(guān)鍵字

如果基類中的方法用此關(guān)鍵字修飾,那么在派生類中,就可以重寫(xiě)此方法;如果基類中的方法沒(méi)有用此關(guān)鍵字修飾,那么在派生類中,就不可以重寫(xiě)此方法。6+.5重載、重寫(xiě)和隱藏

2、重寫(xiě)方法override提供從基類繼承的成員的新實(shí)現(xiàn)。

通過(guò)override聲明重寫(xiě)的方法稱為重寫(xiě)基方法。重寫(xiě)的基方法必須與override方法具有相同的簽名。

不能重寫(xiě)非虛方法、非抽象方法。

被重寫(xiě)的基方法必須是virtual、abstrict和override。6+.5重載、重寫(xiě)和隱藏

例:publicclassPerson{privatestringname;privatestringsex;privatestringid;privateintage;publicvirtualvoidDisplay(){Console.WriteLine(“{0}是{1}性,年齡為{2}”,name,sex,age);}publicvoidDisplay(stringid){this.Display();Console.WriteLine(“身份證號(hào)是{0}”,id);}};6+.5重載、重寫(xiě)和隱藏

publicclassStudent:Person{……publicoverridevoidDisplay(){Console.WriteLine(“這是一個(gè)學(xué)生”);

base.Display();}publicoverridevoidDisplay(stringid){Console.WriteLine(“這是一個(gè)學(xué)生”);

base.Display(id);}};6+.5重載、重寫(xiě)和隱藏

6+.5.3隱藏

指在派生類隱藏基類中具有相同簽名的方法。

在使用新的派生類方法替換基方法時(shí),應(yīng)使用new關(guān)鍵字。

6+.5重載、重寫(xiě)和隱藏

例:publicclassPerson{privatestringname;privatestringsex;privatestringid;privateintage;publicvoidDisplay(){Console.WriteLine(“{0}是{1}性,年齡為{2}”,name,sex,age);}};6+.5重載、重寫(xiě)和隱藏

publicclassStudent:Person{……publicnewvoidDisplay(){Console.WriteLine(“這是一個(gè)學(xué)生”);base.Display();}};

如果沒(méi)有使用new關(guān)鍵字,編譯時(shí)會(huì)給出警告信息:“Student.Display()隱藏了繼承的成員Person.Display(),如果是有意隱藏,請(qǐng)使用關(guān)鍵字new”6+.6索引器

6.6.1什么是索引器索引器提供了一種訪問(wèn)類或結(jié)構(gòu)的方法,即允許按照與數(shù)組相同的方式對(duì)類、結(jié)構(gòu)或接口進(jìn)行索引。6.6.2定義索引器

需要使用this關(guān)鍵字。格式如下:修飾符

數(shù)據(jù)類型this[參數(shù)類型index]//索引器聲明

{//get和set訪問(wèn)器

}

其中:this關(guān)鍵字引用類的當(dāng)前實(shí)例。6+.6索引器

例:帶有索引器的University類設(shè)計(jì)如下:publicclassUniversity{constintMAX=5;privatestring[]name=newstring[MAX];publicstringthis[intindex]//索引器

{get{if(index>=0&&index<MAX)returnname[index];elsereturnname[0];}set{if(index>=0&&index<MAX)name[index]=value;}}};6+.6索引器

classProgram

{staticvoidMain(string[]args)

{Universityuvs=newUniversity();uvs[0]="tsinghua";uvs[1]="beijing";uvs[2]="zhejiang";Console.WriteLine(uvs[2]);

}};6+.6索引器

6’.9索引器

索引器和屬性之間的差別:.屬性可以通過(guò)簡(jiǎn)單的名稱進(jìn)行訪問(wèn),索引可以通過(guò)索引器進(jìn)行訪問(wèn);.屬性可作為靜態(tài)成員或?qū)嵗蓡T,索引器必須作為實(shí)例成員;.屬性的get訪問(wèn)器沒(méi)有參數(shù),索引器的get訪問(wèn)器具有與索引器相同的形參表;.屬性的set訪問(wèn)器包含隱式value參數(shù),索引器的set訪問(wèn)器除value參數(shù)外,還具有與索引器相同的形參表。6+.6索引器

例:usingSystem;namespaceprj{classDayCollection{string[]days={“sun”,”mon”,”tues”,”wed”,”thurs”,”fri”,”sat”};privateintGetDay(stringtestDay){inti=0;

foreach(stringdayindays){if(day==testDay)returni;i++;}return-1;}6+.6索引器

publicintthis[stringday]//索引器

{get{return(GetDay(day));}}ClassProgram{staticvoidMain(string[]args){DayCollectionweek=newDayCollection();Console.WriteLine("Fri:{0}",week["Fri"]);Console.WriteLine("Abc:{0}",week["Abc"]);}};}6+.6索引器

6+.7委托

6.7.1什么是委托?

C++等支持函數(shù)指針,允許在運(yùn)行時(shí)選擇要調(diào)用的函數(shù)。C#提供具有函數(shù)指針功能的結(jié)構(gòu)。通過(guò)Delegate類,委托實(shí)例可以封裝屬于可調(diào)用實(shí)體的方法。委托的特點(diǎn):

.委托類似于C++函數(shù)指針,但它是安全的;

.委托允許將方法作為參數(shù)進(jìn)行傳遞;

.委托可用于定義回調(diào)方法;

.委托可以連接在一起;

.方法不需要與委托簽名精確匹配。6+.7委托

6.7.2定義和使用委托1.聲明委托類型[修飾符]delegate返回類型委托類型名(參數(shù)列表);

例:privatedelegatevoidmydelegate(intn);

聲明了一個(gè)委托mydelegate,該委托類型可以引用一個(gè)采用int作為參數(shù)并返回void的方法。

6+.7委托

2.實(shí)例化委托1)定義委托對(duì)象委托類型名委托對(duì)象名;例:mydelegatep;

創(chuàng)建了mydelegate委托的一個(gè)委托對(duì)象p。

6+.7委托

2)實(shí)例化委托對(duì)象為調(diào)用的方法例:MyDeClass類如下:

classmyDeClass{publicvoidfun1(intn)

{Console.WriteLine(“{0}的2倍={1}”,n,2*n);

}};6+.7委托

可以通過(guò)以下語(yǔ)句實(shí)例化委托對(duì)象p:MyDeClassobj=newMyDeClass();mydelegatep=newmydelegate(obj.fun1);fun1的參數(shù)、返回值類型必須與mydelegate類型聲明的一致。6+.7委托

3.調(diào)用委托

格式如下:委托對(duì)象名(實(shí)參列表);

例如:p(100);6+.7委托

【例6-3】設(shè)計(jì)一個(gè)控制臺(tái)應(yīng)用程序,說(shuō)明委托的使用。Namespaceprj{delegatedoublemydelegate(doublex,doubley);//聲明委托

classMyDeClass{publicdoubleadd(doublex,doubley){returnx+y;}publicdoublesub(doublex,doubley){returnx-y;}publicdoublemul(doublex,doubley){returnx*y;}publicdoublediv(doublex,doubley){returnx/y;}}6+.7委托

ClassProgram{staticvoidMain(string[]args){MyDeClassobj=newMyDeClass();mydelegatep=newmydelegate(obj.add);Console.WriteLine(“5+8={0}”,p(5,8));p=newmydelegate(obj.sub);Console.WriteLine(“5-8={0}”,p(5,8));p=newmydelegate(obj.mul);Console.WriteLine(“5*8={0}”,p(5,8));p=newmydelegate(obj.div);Console.WriteLine(“5/8={0}”,p(5,8));}}}6+.7委托

6+.7委托

前面代碼中的委托對(duì)象p作為引用類型,也可以改為值類型:staticvoidMain(string[]args){MyDeClassobj=newMyDeClass();mydelegatep=obj.add;Console.WriteLine(“5+8={0}”,p(5,8));p=obj.sub;Console.WriteLine(“5-8={0}”,p(5,8));p=obj.mul;Console.WriteLine(“5*8={0}”,p(5,8));p=obj.div;Console.WriteLine(“5/8={0}”,p(5,8));}}}6+.7委托

6.7.3委托對(duì)象封裝多個(gè)方法委托對(duì)象可以封裝多個(gè)方法,這些方法的集合稱為調(diào)用列表。委托使用“+”、“-”、“+=”、“-=”等運(yùn)算符向列表中增加或移除事件處理方法。

6+.7委托

例:namespaceprj{delegatevoidmydelegate(doublex,doubley);//聲明委托classMyDeClass{publicvoidadd(doublex,doubley){Console.WriteLine("{0}+{1}={2}",x,y,x+y);}publicvoidsub(doublex,doubley){Console.WriteLine("{0}-{1}={2}",x,y,x-y);}publicvoidmul(doublex,doubley){Console.WriteLine("{0}*{1}={2}",x,y,x*y);}publicvoiddiv(doublex,doubley){Console.WriteLine("{0}/{1}={2}",x,y,x/y);}};6+.7委托

ClassProgram{staticvoidMain(string[]args){MyDeClassobj=newMyDeClass();mydelegatep,a;a=obj.add;p=a;a=obj.sub;p+=a;a=obj.mul;p+=a;a=obj.div;p+=a;p(5,8);}}}6+.7委托

6+.8事件

6.8.1什么是事件

事件是類在發(fā)生其關(guān)注的事情時(shí)用來(lái)提供通知的一種方式。6.9.2事件的創(chuàng)建和使用

1.為事件創(chuàng)建一個(gè)委托類型事件是通過(guò)委托來(lái)激活的,其返回值為void型。為事件創(chuàng)建一個(gè)委托類型的語(yǔ)

溫馨提示

  • 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)論