版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025機(jī)器買賣合同
- 2025資金托管合同范本資金托管協(xié)議書
- 2025進(jìn)料加工貿(mào)易合同
- 二零二五年度企業(yè)法人股東退出合同3篇
- 二零二五年度景區(qū)保潔員勞動合同3篇
- 2025年度兼職協(xié)議書-企業(yè)數(shù)據(jù)分析師兼職服務(wù)協(xié)議3篇
- 2025年度養(yǎng)牛產(chǎn)業(yè)養(yǎng)殖廢棄物綜合利用合作合同3篇
- 二零二五年度綠色建筑經(jīng)營權(quán)承包管理協(xié)議書3篇
- 2025年度退股投資者關(guān)系維護(hù)協(xié)議3篇
- 二零二五年度農(nóng)村自建房農(nóng)村自建房施工安全責(zé)任合同
- 公交車站臺服務(wù)規(guī)范與安全意識
- 2024電商消費(fèi)趨勢年度報告-flywheel飛未-202412
- 《農(nóng)機(jī)安全》課件
- 浙江省溫州市2023-2024學(xué)年六年級上學(xué)期期末科學(xué)試卷(含答案)3
- 深圳大學(xué)《激光原理與技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 西安市高新第一中學(xué)八年級上冊地理期末試卷(含答案)
- 2024年廣東省深圳市中考英語適應(yīng)性試卷
- 普法學(xué)法知識考試題庫(100題附答案)
- DB37-T 1722-2024公路工程高性能瀝青混合料施工技術(shù)規(guī)范
- 四年級數(shù)學(xué)上冊期末試卷
- 中國普通食物營養(yǎng)成分表(修正版)
評論
0/150
提交評論