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

下載本文檔

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

文檔簡介

第6+章

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

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

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

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

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

;

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

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

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

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

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

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

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

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

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

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

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

類成員的訪問修飾符:

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

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

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

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

2、屬性成員

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

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

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

通過get()和set()訪問器來實現(xiàn)對類的私有字段的讀寫操作。定義屬性成員的語法:[訪問修飾符]數(shù)據(jù)類型屬性名{get{}set{}

}

修飾符有new、public、protected、internal、private、static、virtual、override和abstract。屬性是通過訪問器實現(xiàn)的。訪問器是字段賦值和檢索其值的特殊方法。Set訪問器為字段賦值;get訪問器檢索字段的值。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ò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分部類分部類可以將類的聲明拆分到多個原文件中,被拆分類的每一部分定義的前邊都要用partial關(guān)鍵字修飾,并且分部類的每一部分都可以放在不同的文件中。

例:

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

②在另一個文件中

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

③在第三個文件中

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

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

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

對象名=new類名();

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

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

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

6.2.2訪問對象的字段及屬性

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

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

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

值傳遞是C#默認(rèn)的傳遞方式,使用值傳遞方式時,向形式參數(shù)(形參)傳遞的是實在參數(shù)(實參)的副本。方法內(nèi)發(fā)生的對形參的更改對實參本身沒有影響。2.引用型參數(shù)引用型參數(shù)本身不創(chuàng)造新的存儲空間,而是把實參的地址傳給形參。形參和實參指向同一存儲單元,對形參的改變就是對實參的改變。引用型參數(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)造新的存儲空間。它與引用類型參數(shù)的差別在于,調(diào)用方法前無需對變量(作為輸出實參)進(jìn)行初始化。它用于傳遞方法返回的數(shù)據(jù)。輸出型參數(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ù),并且在方法聲明中只允許一個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繼承

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

6+.5.1重載

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

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

6+.5.2重寫

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

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

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

通過override聲明重寫的方法稱為重寫基方法。重寫的基方法必須與override方法具有相同的簽名。

不能重寫非虛方法、非抽象方法。

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

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

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

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

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

6+.5.3隱藏

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

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

6+.5重載、重寫和隱藏

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

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

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

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

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

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

{//get和set訪問器

}

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

例:帶有索引器的University類設(shè)計如下: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索引器

索引器和屬性之間的差別:.屬性可以通過簡單的名稱進(jìn)行訪問,索引可以通過索引器進(jìn)行訪問;.屬性可作為靜態(tài)成員或?qū)嵗蓡T,索引器必須作為實例成員;.屬性的get訪問器沒有參數(shù),索引器的get訪問器具有與索引器相同的形參表;.屬性的set訪問器包含隱式value參數(shù),索引器的set訪問器除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)行時選擇要調(diào)用的函數(shù)。C#提供具有函數(shù)指針功能的結(jié)構(gòu)。通過Delegate類,委托實例可以封裝屬于可調(diào)用實體的方法。委托的特點(diǎn):

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

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

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

.委托可以連接在一起;

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

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

例:privatedelegatevoidmydelegate(intn);

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

6+.7委托

2.實例化委托1)定義委托對象委托類型名委托對象名;例:mydelegatep;

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

6+.7委托

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

classmyDeClass{publicvoidfun1(intn)

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

}};6+.7委托

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

3.調(diào)用委托

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

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

【例6-3】設(shè)計一個控制臺應(yīng)用程序,說明委托的使用。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委托

前面代碼中的委托對象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委托對象封裝多個方法委托對象可以封裝多個方法,這些方法的集合稱為調(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)注的事情時用來提供通知的一種方式。6.9.2事件的創(chuàng)建和使用

1.為事件創(chuàng)建一個委托類型事件是通過委托來激活的,其返回值為void型。為事件創(chuàng)建一個委托類型的語

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論