




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C#面向?qū)ο缶幊袒A(chǔ)學(xué)習(xí)筆記第一頁(yè),編輯于星期六:七點(diǎn)三十九分。3.1繼承在2.1.5節(jié),定義了一個(gè)描述個(gè)人情況的Person類。如需要描述一個(gè)雇員,當(dāng)然可以從頭開始定義Employee類用來描述雇員。但這樣不能利用Person類中已定義的函數(shù)和數(shù)據(jù)。比較好的方法是以Person類為基類,派生出Employee類,Employee類繼承了Person類的數(shù)據(jù)成員和函數(shù)成員,既Person類的數(shù)據(jù)成員和函數(shù)成員成為Employee類的成員。這個(gè)Employee類叫以Person類為基類的派生類,這是C#提出的方法。C#用繼承的方法,實(shí)現(xiàn)代碼的重用。第二頁(yè),編輯于星期六:七點(diǎn)三十九分。3.1.1派生類的聲明格式
派生類的聲明格式如下:
附加說明類修飾符class派生類名:基類名{類體}雇員類Employee定義如下:
classEmployee:Person{ privatestringdepartment; privatedecimalsalary; publicEmployee(stringName,intAge, stringD,decimalS):base(Name,Age) { department=D; salary=S; }
第三頁(yè),編輯于星期六:七點(diǎn)三十九分。publicnewvoidDisplay()//注意new{ base.Display();//訪問基類的同名方法 Console.WriteLine(“部門:{0}薪金:{1}”, department,salary);}}主函數(shù)如下:classClass1{ staticvoidMain(string[]args) {EmployeeOneEmployee=newEmployee( “李四”,30,"計(jì)算機(jī)系",2000); OneEmployee.Display(); }}
第四頁(yè),編輯于星期六:七點(diǎn)三十九分。3.1.2隱藏基類方法
在派生類中,可以聲明與基類完全相同的新方法,完全相同是指和基類方法的函數(shù)類型、函數(shù)名、參數(shù)類型和個(gè)數(shù)都相同。如上例中的方法Display()。這樣做不算錯(cuò)誤,但會(huì)導(dǎo)致編譯器發(fā)出警告。如果增加new修飾符,表示認(rèn)可,編譯器不再發(fā)出警告。請(qǐng)注意,聲明與基類完全相同新方法,并不是移走基類同名方法,只是在派生類中必須用如下格式訪問基類中同名方法:base.Display();也就是說派生類的新方法隱藏了基類同名方法。
第五頁(yè),編輯于星期六:七點(diǎn)三十九分。3.1.3base關(guān)鍵字
base關(guān)鍵字用于從派生類中訪問基類成員,它有兩種基本用法:
在定義派生類的構(gòu)造函數(shù)中,指明要調(diào)用的基類構(gòu)造函數(shù),由于基類可能有多個(gè)構(gòu)造函數(shù),根據(jù)base后的參數(shù)類型和個(gè)數(shù),指明要調(diào)用哪一個(gè)基類構(gòu)造函數(shù)。在派生類的方法中調(diào)用基類中被派生類隱藏的方法。
第六頁(yè),編輯于星期六:七點(diǎn)三十九分。3.1.4C#語(yǔ)言類繼承特點(diǎn)
C#語(yǔ)言只允許單繼承,即派生類只能有一個(gè)基類。
C#語(yǔ)言繼承是可以傳遞的,如果C從B派生,B從A派生,那么C不但繼承B的成員,還要繼承A中的成員。派生類可以添加新成員,但不能刪除基類中的成員派生類不繼承基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。能繼承基類的屬性。派生類可以隱藏基類的同名成員,如果在派生類中隱藏了基類同名成員,基類該成員在派生類中就不能被直接訪問,只能通過base.基類方法名訪問。派生類對(duì)象也是其基類的對(duì)象,但基類對(duì)象卻不一定是其派生類的對(duì)象。例如,前邊定義的雇員類Employee是Person類的派生類,所有雇員都是Person類的成員,但很多Person類的成員并不是雇員,可能是學(xué)生、自由職業(yè)者、兒童等。因此C#語(yǔ)言規(guī)定,基類的引用變量可以引用其派生類對(duì)象,但派生類的引用變量不可以引用其基類對(duì)象。
第七頁(yè),編輯于星期六:七點(diǎn)三十九分。3.2類的成員
由于C#程序中每個(gè)變量或函數(shù)都必須屬于一個(gè)類或結(jié)構(gòu),不能象C或C++那樣建立全局變量,因此所有的變量或函數(shù)都是類或結(jié)構(gòu)的成員。類的成員可以分為兩大類:類本身所聲明的以及從基類中繼承來的。
第八頁(yè),編輯于星期六:七點(diǎn)三十九分。3.2.1類的成員類型
類的成員包括以下類型局部變量:在for、switch等語(yǔ)句中和類方法中定義的變量
字段:即類中的變量或常量,包括靜態(tài)字段、實(shí)例字段、常量 和只讀字段。方法成員:即類中的方法,包括靜態(tài)方法和實(shí)例方法。
屬性:按屬性指定的get方法和set方法對(duì)字段進(jìn)行讀寫。屬 性本質(zhì)上是方法。事件:代表事件本身,同時(shí)是事件處理函數(shù)的代表。索引指示器:允許象數(shù)組那樣使用索引訪問類中的數(shù)據(jù)成員。重載操作符:采用重載操作符的方法定義類中特有的操作。構(gòu)造函數(shù)和析構(gòu)函數(shù)。
第九頁(yè),編輯于星期六:七點(diǎn)三十九分。3.2.2類成員訪問修飾符
訪問修飾符有4種,用于指定類成員的可訪問性:
Private:protected:public:Internal:內(nèi)部成員只能在同一程序集中的文件中才是可以訪問的,一般是同一個(gè)應(yīng)用(Application)或庫(kù)(Library)。
第十頁(yè),編輯于星期六:七點(diǎn)三十九分。3.3類的字段和屬性
一般把類或結(jié)構(gòu)中定義的變量和常量叫字段。屬性不是字段,本質(zhì)上是定義修改字段的方法,由于屬性和字段的緊密關(guān)系,把它們放到一起敘述。
第十一頁(yè),編輯于星期六:七點(diǎn)三十九分。3.3.1靜態(tài)字段、實(shí)例字段、常量和只讀字段
見下例:publicclassTest{publicconstintintMax=int.MaxValue;//常量必須賦初值publicintx=0; //實(shí)例字段,每個(gè)實(shí)例創(chuàng)建不同xpublicreadonlyinty=0;//只讀字段,每個(gè)實(shí)例創(chuàng)建不同ypublicstaticintcnt=0;//靜態(tài)字段,所有實(shí)例共用一個(gè)cntpublicTest(intx1,inty1) //構(gòu)造函數(shù){ //intMax=0;錯(cuò)誤,在構(gòu)造函數(shù)不能修改常量 x=x1; //在構(gòu)造函數(shù)允許修改實(shí)例字段 y=y1; //在構(gòu)造函數(shù)允許修改只讀字段 cnt++;//每創(chuàng)建一個(gè)對(duì)象都調(diào)用構(gòu)造函數(shù), //用此語(yǔ)句可以記錄對(duì)象的個(gè)數(shù)}
第十二頁(yè),編輯于星期六:七點(diǎn)三十九分。publicvoidModify(intx1,inty1){ //intMax=0;和y=10;錯(cuò)誤,不能修改常量和只讀字段 x=x1; cnt=y1;}}classClass1{ staticvoidMain(string[]args){ TestT1=newTest(100,200); T1.x=40;//引用實(shí)例字段方法:實(shí)例名.實(shí)例字段名 Tt=0;//引用靜態(tài)字段方法:類名.靜態(tài)字段名 intz=T1.y; //引用只讀字段 z=TMax; //引用常量}}第十三頁(yè),編輯于星期六:七點(diǎn)三十九分。3.3.2屬性
C#語(yǔ)言支持組件編程,組件也是類,組件用屬性、方法、事件描述。屬性不是字段,但必然和類中的某個(gè)或某些字段相聯(lián)系,屬性定義了得到和修改相聯(lián)系的字段的方法。C#中的屬性更充分地體現(xiàn)了對(duì)象的封裝性:不直接操作類的數(shù)據(jù)內(nèi)容,而是通過訪問器進(jìn)行訪問,借助于get和set方法對(duì)屬性的值進(jìn)行讀寫。訪問屬性值的語(yǔ)法形式和訪問一個(gè)變量基本一樣,使訪問屬性就象訪問變量一樣方便,符合習(xí)慣。在類的基本概念一節(jié)中,定義一個(gè)描述個(gè)人情況的類Person,其中字段name和age是私有字段,記錄姓名和年齡,外部通過公有方法SetName和SetAge修改這兩個(gè)私有字段?,F(xiàn)在用屬性來描述姓名和年齡。例子如下:
第十四頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;publicclassPerson{ privatestringP_name="張三";//P_name是私有字段 privateintP_age=12; //P_age是私有字段 publicvoidDisplay()//類的方法聲明,顯示姓名和年齡 { Console.WriteLine(“姓名:{0},年齡:{1}”, P_name,P_age); } publicstringName //定義屬性Name { get{ returnP_name; } set{ P_name=value; } } publicintAge //定義屬性Age { get{ returnP_age; } set{ P_age=value; } }}第十五頁(yè),編輯于星期六:七點(diǎn)三十九分。publicclassTest{ publicstaticvoidMain(){ PersonOnePerson=newPerson(); OnePerson.Name="田七";//通過set方法修改變量P_Name strings=OnePerson.Name;//通過get方法得到變量P_Name值
//下句錯(cuò)誤Test不是Person派生類,不能修改Age屬性 //OnePerson.Age=20; intx=OnePerson.Age;//通過定義屬性,既保證了姓名 //和年齡按指定方法修改 OnePerson.Display();//語(yǔ)法形式和修改、 //得到一個(gè)變量基本一致,符合習(xí)慣}} 只有set訪問器的屬性值只能進(jìn)行設(shè)置而不能讀出,只有g(shù)et訪問器的屬性值是只讀的,不能改寫,同時(shí)具有set和get訪問器表明屬性值的讀寫都是允許的。
第十六頁(yè),編輯于星期六:七點(diǎn)三十九分。3.4類的方法3.4.1方法的聲明
方法的聲明格式如下:方法修飾符返回類型方法名(形參列表){方法體}
3.4.2方法中參數(shù)的傳遞值參數(shù),不含任何修飾符(值類型、引用類型不同)
引用參數(shù),以ref修飾符聲明(主要用于值類型)輸出參數(shù),以out修飾符聲明(主要用于值類型)usingSystem;classg{publicinta=0;}//類定義
第十七頁(yè),編輯于星期六:七點(diǎn)三十九分。classClass1{ publicstaticvoidF1(refchari) //引用參數(shù) { i='b'; } publicstaticvoidF2(chari)//值參數(shù),形參類型為值類型 { i='d'; } publicstaticvoidF3(outchari) //輸出參數(shù) { i='e'; }publicstaticvoidF4(strings)//值參數(shù)形參類型為字符串{s="xyz";}//雖然字符串為引用類型,參數(shù)傳遞方式和值類型相同 publicstaticvoidF5(ggg)//值參數(shù),形參類型為引用類型 { gg.a=20; }publicstaticvoidF6(refstrings) { s=“xyz”; }//引用參數(shù),形參類型為字符串staticvoidMain(string[]args){ chara='c'; strings1="abc";第十八頁(yè),編輯于星期六:七點(diǎn)三十九分。 F2(a); //值參數(shù),不能修改外部的a Console.WriteLine(a); //因a未被修改,顯示c F1(refa); //引用參數(shù),函數(shù)修改外部的a的值 Console.WriteLine(a); //a被修改為b,顯示b Charj; F3(outj); //輸出參數(shù),結(jié)果輸出到外部變量j Console.WriteLine(j); //顯示e F4(s1);//值參數(shù),參數(shù)類型是字符串,s1為字符串引用變量 Console.WriteLine(s1);//顯示:abc,字符串s1不被修改 gg1=newg(); F5(g1);//值參數(shù),但實(shí)參是一個(gè)類引用類型變量 Console.WriteLine(g1.a.ToString());//顯示:20修改對(duì)象數(shù)據(jù) F6(refs1);//引用參數(shù),參數(shù)類型是字符串,s1為字符串引用變量 Console.WriteLine(s1);//顯示:xyz,字符串s1被修改 }}第十九頁(yè),編輯于星期六:七點(diǎn)三十九分。數(shù)組參數(shù),以params修飾符聲明,數(shù)組參數(shù)使用params說明,如果形參表中包含了數(shù)組參數(shù),那么它必須是參數(shù)表中最后一個(gè)參數(shù),數(shù)組參數(shù)只允許是一維數(shù)組。usingSystem;classClass1{ staticvoidF(paramsint[]args) //數(shù)組參數(shù) { Console.Write(“數(shù)組包含{0}個(gè)元素:”, args.Length); foreach(intiinargs) Console.Write("{0}",i); }第二十頁(yè),編輯于星期六:七點(diǎn)三十九分。staticvoidMain(string[]args){int[]a={1,2,3}; F(a); //實(shí)參為數(shù)組類引用變量a F(10,20,30,40);//等價(jià)于F(newint[]{10,20,30,40}) F(newint[]{60,70,80,90});//實(shí)參為數(shù)組類引用 F(); //等價(jià)于F(newint[]{}); F(newint[]{});//實(shí)參為數(shù)組類引用,數(shù)組無元素}}程序輸出數(shù)組包含3個(gè)元素:123數(shù)組包含4個(gè)元素:10203040數(shù)組包含4個(gè)元素:60,70,80,90數(shù)組包含0個(gè)元素:數(shù)組包含0個(gè)元素:
第二十一頁(yè),編輯于星期六:七點(diǎn)三十九分。 方法的參數(shù)為數(shù)組時(shí)也可以不使用params,此種方法可以使用一維或多維數(shù)組,見下例:usingSystem;classClass1{ staticvoidF(int[,]args)//值參數(shù)類型為數(shù)組類引用變量 { Console.Write("數(shù)組包含{0}個(gè)元素:",args.Length); foreach(intiinargs) Console.Write("{0}",i); } staticvoidMain(string[]args) { int[,]a={{1,2,3},{4,5,6}}; F(a); //實(shí)參為數(shù)組類引用變量a//F(10,20,30,40);F();F(newint[,]{});這兩種格式不能使用 F(newint[,]{{60,70},{80,90}});//實(shí)參為數(shù)組類引用 }}
第二十二頁(yè),編輯于星期六:七點(diǎn)三十九分。3.4.3靜態(tài)方法和實(shí)例方法
用修飾符static聲明的方法為靜態(tài)方法
不管類生成或未生成對(duì)象,類的靜態(tài)方法都可以被使用,使用格式為:類名.靜態(tài)方法名。靜態(tài)方法只能使用該靜態(tài)方法所在類的靜態(tài)數(shù)據(jù)成員和靜態(tài)方法。這是因?yàn)槭褂渺o態(tài)方法時(shí),該靜態(tài)方法所在類可能還沒有對(duì)象不用修飾符static聲明的方法為實(shí)例方法
在類創(chuàng)建對(duì)象后,實(shí)例方法才能被使用,使用格式為:對(duì)象名.實(shí)例方法名。實(shí)例方法可以使用該方法所在類的所有靜態(tài)成員和實(shí)例成員。例子如下:
第二十三頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;publicclassUseMethod{ privatestaticintx=0;//靜態(tài)字段privateinty=1;//實(shí)例字段publicstaticvoidStaticMethod()//靜態(tài)方法{ x=10; //正確,靜態(tài)方法訪問靜態(tài)數(shù)據(jù)成員 //y=20;錯(cuò)誤,靜態(tài)方法不能訪問實(shí)例數(shù)據(jù)成員}publicvoidNoStaticMethod()//實(shí)例方法{ x=10; //正確,實(shí)例方法訪問靜態(tài)數(shù)據(jù)成員y=20; //正確,實(shí)例方法訪問實(shí)例數(shù)據(jù)成員}}第二十四頁(yè),編輯于星期六:七點(diǎn)三十九分。publicclassClass1{ publicstaticvoidMain(){ UseMethodm=newUseMethod();//使用靜態(tài)方法格式為:類名.靜態(tài)方法名 UseMethod.StaticMethod(); //使用實(shí)例方法格式為:對(duì)象名.實(shí)例方法名 m.NoStaticMethod();}}第二十五頁(yè),編輯于星期六:七點(diǎn)三十九分。3.4.4操作符重載
usingSystem;classComplex //復(fù)數(shù)類定義{ privatedoubleReal; //復(fù)數(shù)實(shí)部 privatedoubleImag; //復(fù)數(shù)虛部 publicComplex(doublex,doubley) //構(gòu)造函數(shù) { Real=x; Imag=y; } staticpublicComplexoperator-(Complexa) {return(newComplex(-a.Real,-a.Imag)); }//重載一元操作符
staticpublicComplexoperator+(Complexa,Complexb){ return(newComplex(a.Real+b.Real,a.Imag+b.Imag));}publicvoidDisplay(){ Console.WriteLine("{0}+({1})j",Real,Imag); }}第二十六頁(yè),編輯于星期六:七點(diǎn)三十九分。classClass1{ staticvoidMain(string[]args) {Complexx=newComplex(1.0,2.0); Complexy=newComplex(3.0,4.0); Complexz=newComplex(5.0,7.0); x.Display(); //顯示:1+(2)j y.Display(); //顯示:3+(4)j z.Display(); //顯示:5+(7)j z=-x; //等價(jià)于z=opeator-(x) z.Display(); //顯示:-1+(-2)j z=x+y; //即z=opeator+(x,y) z.Display(); //顯示:4+(6)j }}第二十七頁(yè),編輯于星期六:七點(diǎn)三十九分。3.4.5this關(guān)鍵字
每個(gè)類都可以有多個(gè)對(duì)象,例如定義Person類的兩個(gè)對(duì)象:PersonP1=newPerson("李四",30);PersonP2=newPerson("張三",40);因此P1.Display()應(yīng)顯示李四信息,P2.Display()應(yīng)顯示張三信息,但無論創(chuàng)建多少個(gè)對(duì)象,只有一個(gè)方法Display(),該方法是如何知道顯示哪個(gè)對(duì)象的信息的呢?C#語(yǔ)言用引用變量this記錄調(diào)用方法Display()的對(duì)象,當(dāng)某個(gè)對(duì)象調(diào)用方法Display()時(shí),this便引用該對(duì)象(記錄該對(duì)象的地址)。
第二十八頁(yè),編輯于星期六:七點(diǎn)三十九分。3.5類的多態(tài)性
C#支持兩種類型的多態(tài)性編譯時(shí)的多態(tài)性
編譯時(shí)的多態(tài)性是通過方法重載來實(shí)現(xiàn)的。
運(yùn)行時(shí)的多態(tài)性
是在系統(tǒng)運(yùn)行時(shí),不同對(duì)象調(diào)用一個(gè)名字相同,參數(shù)的類型及個(gè)數(shù)完全一樣的方法,會(huì)完成不同的操作。C#運(yùn)行時(shí)的多態(tài)性通過虛方法實(shí)現(xiàn)。在類的方法聲明前加上了virtual修飾符,被稱之為虛方法,反之為非虛方法。
第二十九頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;classA{ publicvoidF() //非虛方法{ Console.Write("A.F"); }publicvirtualvoidG() //虛方法{Console.Write("A.G"); }}classB:A //A類為B類的基類{ newpublicvoidF()//隱藏基類的同名非虛方法F注意使用new{ Console.Write("B.F"); }publicoverridevoidG()//隱藏基類同名虛方法G使用override{ Console.Write("B.G"); }}第三十頁(yè),編輯于星期六:七點(diǎn)三十九分。classTest{ staticvoidF2(AaA) //注意,參數(shù)為A類引用變量{ aA.G(); }staticvoidMain(){Bb=newB();Aa1=newA();Aa2=b;//允許基類引用變量引用派生類對(duì)象a2引用派生類B對(duì)象ba1.F(); //調(diào)用基類A的非虛方法F(),顯示A.Fa2.F(); //F()為非虛方法,調(diào)用基類A的F(),顯示A.Fb.F(); //F()為非虛方法,調(diào)用派生類B的F(),顯示B.Fa1.G();//G為虛方法,因a1引用基類A對(duì)象,調(diào)用基類A的G,顯示A.Ga2.G();//G為虛方法,a2引用派生類B對(duì)象,調(diào)用派生類B的G,顯示B.GF2(b);//實(shí)參為派生類B對(duì)象,AaA=b,調(diào)用派生類B的函數(shù)G,顯示B.GF2(a1);//實(shí)參為基類A對(duì)象,調(diào)用A類的函數(shù)G(),顯示A.G}}第三十一頁(yè),編輯于星期六:七點(diǎn)三十九分。3.6作用域作用域又稱作用范圍,它指的是標(biāo)識(shí)符可以使用的范圍。C#語(yǔ)言中,類(或結(jié)構(gòu))成員的作用域是整個(gè)類;方法內(nèi)聲明的局部變量(含局部常量)的作用域從它的聲明開始延續(xù)到包含它的塊尾。第三十二頁(yè),編輯于星期六:七點(diǎn)三十九分。3.6.1類成員的作用域C#語(yǔ)言中類成員的作用域是整個(gè)類。因此,類定義中,成員之間的順序是任意的。例如:classTest{publicvoidMyMethod(){num++;Console.WriteLine(num);}privateintnum=0;}上例就把字段的聲明放在類體的尾部,而在前面定義了使用該字段的方法。第三十三頁(yè),編輯于星期六:七點(diǎn)三十九分。3.6.2局部變量的作用域方法體內(nèi)聲明的變量稱為局部變量,局部變量的作用域從它的聲明開始延續(xù)到包含它的塊尾。例如:voidf1(){inti=100; //變量i作用域的起始處if(i>0){...intj=10; //變量j作用域的起始處...} //變量j作用域的結(jié)束處} //變量i作用域的結(jié)束處第三十四頁(yè),編輯于星期六:七點(diǎn)三十九分。3.7抽象類和抽象方法
抽象類只能作為其他類的基類,它不能直接被實(shí)例化。
抽象類允許包含抽象方法,雖然這不是必須的。抽象方法用abstract修飾符修飾。
抽象類不能同時(shí)又是密封的。
抽象類的基類也可以是抽象類。如果一個(gè)非抽象類的基類是抽象類,則該類必須通過隱藏來實(shí)現(xiàn)所有繼承而來的抽象方法,包括其抽象基類中的抽象方法,如果該抽象基類從其他抽象類派生,還應(yīng)包括其他抽象類中的所有抽象方法。
請(qǐng)看下面的示例:
第三十五頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;abstractclassFigure//抽象類定義,表示一個(gè)抽象圖形{ protecteddoublex=0,y=0; publicFigure(doublea,doubleb) { x=a; y=b; }
//抽象方法,無實(shí)現(xiàn)代碼,抽象圖形無法計(jì)算面積publicabstractvoidArea();}classSquare:Figure //類Square定義,矩形類{ publicSquare(doublea,doubleb):base(a,b) {}publicoverridevoidArea()//不能使用new,必須用override{ Console.WriteLine("矩形面積是:{0}",x*y);}}第三十六頁(yè),編輯于星期六:七點(diǎn)三十九分。classCircle:Figure //類Circle定義,圓類{ publicCircle(doublea):base(a,a) {}publicoverridevoidArea(){Console.WriteLine("圓面積是:{0}",3.14*x*y);}}classClass1{ staticvoidMain(string[]args) { Squares=newSquare(20,30); Circlec=newCircle(10); s.Area(); c.Area(); }}程序輸出結(jié)果為:矩形面積是:600圓面積是:314第三十七頁(yè),編輯于星期六:七點(diǎn)三十九分。3.8密封類和密封方法
有時(shí)候,我們并不希望自己編寫的類被繼承?;蛘哂械念愐呀?jīng)沒有再被繼承的必要。C#提出了一個(gè)密封類(sealedclass)的概念,幫助開發(fā)人員來解決這一問題。密封類在聲明中使用sealed修飾符,這樣就可以防止該類被其他類繼承。如果試圖將一個(gè)密封類作為其他類的基類,C#編譯器將提示出錯(cuò)。理所當(dāng)然,密封類不能同時(shí)又是抽象類,因?yàn)槌橄罂偸窍M焕^承的。C#還提出了密封方法(sealedmethod)的概念。方法使用sealed修飾符,稱該方法是一個(gè)密封方法。在派生類中,不能重新定義基類中的密封方法。
第三十八頁(yè),編輯于星期六:七點(diǎn)三十九分。3.9靜態(tài)類和靜態(tài)類成員
C#2.0中的類可以聲明為靜態(tài)的,例如staticclassMyClass{}表示MyClass類是靜態(tài)的。靜態(tài)類僅包含靜態(tài)成員,不能使用new創(chuàng)建靜態(tài)類的對(duì)象,靜態(tài)類必須是密封的,不能有構(gòu)造函數(shù)。靜態(tài)類在加載包含該類的程序或命名空間時(shí)由CLR自動(dòng)加載。
第三十九頁(yè),編輯于星期六:七點(diǎn)三十九分。3.10C#2.0中的分部類
分部類可將類、結(jié)構(gòu)或接口的定義拆分到兩個(gè)或多個(gè)源文件中。若要拆分類定義,被拆分類的每一部分的定義前邊都要用partial關(guān)鍵字修飾,類的每一部分定義可以存到不同源文件中,編譯應(yīng)用程序時(shí)將把所有部分組合起來。VS2005生成的Windows應(yīng)用程序框架采用了分部類的概念,F(xiàn)orm1類用分部類方法分成兩部分,在不同文件中,其中Form1.Designer.cs文件是由VS2005自動(dòng)生成的代碼,自己編寫的代碼應(yīng)放到Form1.cs文件中。
第四十頁(yè),編輯于星期六:七點(diǎn)三十九分。3.11接口
在接口中可以聲明方法、屬性、索引指示器和事件,接口中并不提供它們的實(shí)現(xiàn)。因此接口是函數(shù)成員聲明的集合。如果類或結(jié)構(gòu)從一個(gè)接口派生,則這個(gè)類或結(jié)構(gòu)負(fù)責(zé)實(shí)現(xiàn)該接口中所聲明的所有函數(shù)成員。一個(gè)接口可以繼承多個(gè)接口,而一個(gè)類或結(jié)構(gòu)可以實(shí)現(xiàn)多個(gè)接口。由于C#語(yǔ)言不支持多繼承,因此,如果某個(gè)類需要繼承多個(gè)類的行為時(shí),只能使用多個(gè)接口加以說明。第四十一頁(yè),編輯于星期六:七點(diǎn)三十九分。3.11.1接口聲明
publicinterfaceIexample { //索引指示器聲明 stringthis[intindex]{get;set;} eventEventHandlerE; //事件聲明voidF(intvalue); //方法聲明stringP{get;set;} //屬性聲明} 首先接口成員只能是方法、屬性、索引指示器和事件。所有接口成員都不能包括實(shí)現(xiàn)。接口成員聲明不能包含任何修飾符,接口成員默認(rèn)訪問方式是public。
第四十二頁(yè),編輯于星期六:七點(diǎn)三十九分。3.11.2接口的繼承 類似于類的繼承性,接口也有繼承性。派生接口繼承了基接口中的函數(shù)成員說明。接口允許多繼承,一個(gè)派生接口可以沒有基接口,也可以有多個(gè)基接口。在接口聲明的冒號(hào)后列出被繼承的接口名字,多個(gè)接口名之間用分號(hào)分割。例子如下:
第四十三頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;interfaceIControl{ voidPaint(); }//繼承了接口Icontrol的方法Paint()interfaceITextBox:Icontrol{ voidSetText(stringtext); }//繼承了接口Icontrol的方法Paint()interfaceIListBox:Icontrol{ voidSetItems(string[]items); }//繼承了接口Icontrol、ITextBox和IListBox的方法interfaceIComboBox:ITextBox,IListBox{ } //可以聲明新方法
第四十四頁(yè),編輯于星期六:七點(diǎn)三十九分。3.11.3類對(duì)接口的實(shí)現(xiàn)
類實(shí)現(xiàn)接口的本質(zhì)是,用接口規(guī)定類應(yīng)實(shí)現(xiàn)哪些函數(shù)成員。用類來實(shí)現(xiàn)接口時(shí),接口的名稱必須包含在類聲明中的基類列表中。
在類的基本概念一節(jié)中,定義一個(gè)描述個(gè)人情況的類Person,從類Person可以派生出其他類,例如:工人類、公務(wù)員類、醫(yī)生類等。這些類有一些共有的方法和屬性,例如工資屬性。一般希望所有派生類訪問工資屬性時(shí)用同樣變量名。該屬性定義在類Person中不合適,因?yàn)橛行┤藷o工資,如小孩。如定義一個(gè)類作為基類,包含工資屬性,但C#不支持多繼承??尚械霓k法是使用接口,在接口中聲明工資屬性。工人類、公務(wù)員類、醫(yī)生類等都必須實(shí)現(xiàn)該接口,也就保證了它們?cè)L問工資屬性時(shí)用同樣變量名。例子如下:
第四十五頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;publicinterfaceI_Salary//接口{ decimalSalary//屬性聲明 { get; set; }}publicclassPerson//參見1.9.2節(jié)Person類定義{…}//但age的set訪問權(quán)限要改為public//Person類是基類,I_Salary是接口publicclassEmployee:Person,I_Salary{//不同程序員完成工人類、醫(yī)生類等,定義工資變量名稱可能不同privatedecimalsalary;publicnewvoidDisplay(){ base.Display(); Console.WriteLine("薪金:{0}",salary);}第四十六頁(yè),編輯于星期六:七點(diǎn)三十九分。//工人類、醫(yī)生類等都要按以下方法實(shí)現(xiàn)屬性Salary,保證工資屬性同名publicdecimalSalary { get{ returnsalary; } set{ salary=value; } }}publicclassTest{ publicstaticvoidMain(){ EmployeeS=newEmployee(); S.Name="田七";//修改屬性Name S.Age=20;//修改屬性Age S.Salary=2000;//修改屬性Salary S.Display();}}
第四十七頁(yè),編輯于星期六:七點(diǎn)三十九分。 如果類繼承了某個(gè)接口,類也隱式地繼承了該接口的所有基接口,不管這些基接口有沒有在類聲明的基類表中列出。因此,如果類從一個(gè)接口派生,則這個(gè)類負(fù)責(zé)實(shí)現(xiàn)該接口及該接口的所有基接口中所聲明的所有成員。
第四十八頁(yè),編輯于星期六:七點(diǎn)三十九分。3.12委托類型C#的一個(gè)新的引用數(shù)據(jù)類型:代表類型,也翻譯為委托類型。在功能上它類似C語(yǔ)言的函數(shù)指針,目的是通過創(chuàng)建代表類型對(duì)象去調(diào)用函數(shù)。使用代表類型的第一步,是從delegate類派生出一個(gè)代表類型,指明這個(gè)代表類型對(duì)象要代表的函數(shù)的返回值類型,參數(shù)的個(gè)數(shù)及類型,因此C#中的代表類型是類型安全的。聲明一個(gè)代表類型格式如下:修飾符delegate函數(shù)返回類型定義的代表標(biāo)識(shí)符(函數(shù)形參列表);
例如我們可以聲明一個(gè)能代表返回類型為int,無參數(shù)的函數(shù)的代表類型,類型名為MyDelegate,類型聲明如下,只能代表返回類型為int,無參數(shù)的函數(shù)
publicdelegateintMyDelegate(); 聲明了代表類型MyDelegate,可創(chuàng)建代表類型MyDelegate的對(duì)象,用這個(gè)對(duì)象去代表一個(gè)靜態(tài)方法或非靜態(tài)的方法,所代表的方法必須為int類型,無參數(shù)??聪旅娴睦樱?/p>
第四十九頁(yè),編輯于星期六:七點(diǎn)三十九分。usingSystem;delegateintMyDelegate();//聲明一個(gè)代表類型注意位置publicclassMyClass{ publicintInstanceMethod()//非靜態(tài)int類型,無參數(shù)方法{ Console.WriteLine("調(diào)用了非靜態(tài)的方法。"); return0; }staticpublicintStaticMethod()//靜態(tài)int類型無參數(shù)方法{ Console.WriteLine("調(diào)用了靜態(tài)的方法。"); return0; }}publicclassTest{ staticpublicvoidMain(){ MyClassp=newMyClass();//用new建立代表類型MyDelegate對(duì)象,對(duì)象d代表了方法InstanceMethodMyDelegated=newMyDelegate(p.InstanceMethod); //參數(shù)是被代表的方法
第五十頁(yè),編輯于星期六:七點(diǎn)三十九分。d();//因?qū)ο骴代表了方法InstanceMethod,調(diào)用非靜態(tài)方法//下條語(yǔ)句對(duì)象d代表了方法StaticMethod,參數(shù)是被代表的方法d=newMyDelegate(MyClass.StaticMethod); d();//因?qū)ο骴代表了方法StaticMethod,用此方式調(diào)用這個(gè)靜態(tài)方法}}程序的輸出結(jié)果是:調(diào)用了非靜態(tài)的方法。調(diào)用了靜態(tài)的方法。第五十一頁(yè),編輯于星期六:七點(diǎn)三十九分。3.13事件
3.13.1事件驅(qū)動(dòng)
事件是C#語(yǔ)言內(nèi)置的語(yǔ)法,可以定義和處理事件,為使用組件編程提供了良好的基礎(chǔ)。
Windows應(yīng)用程序和dos程序的最大不同是采用事件驅(qū)動(dòng)方式工作,也叫消息驅(qū)動(dòng)。dos程序如要從鍵盤輸入數(shù)據(jù),則要獨(dú)占鍵盤等待用戶輸入,如用戶不輸入,則CPU一直執(zhí)行鍵盤輸入程序,等待用戶輸入,即dos程序獨(dú)占外設(shè)和CPU。Windows操作系統(tǒng)是一個(gè)多任務(wù)的操作系統(tǒng),允許同時(shí)運(yùn)行多個(gè)程序,它不允許任何一個(gè)程序獨(dú)占外設(shè),如鍵盤、鼠標(biāo)等,所有運(yùn)行程序共享外設(shè)和CPU,各個(gè)運(yùn)行程序都要隨時(shí)準(zhǔn)備從外設(shè)接受命令,執(zhí)行命令。因此必須由Windows操作系統(tǒng)統(tǒng)一管理各種外設(shè)。
第五十二頁(yè),編輯于星期六:七點(diǎn)三十九分。 Windows把用戶對(duì)外設(shè)的動(dòng)作都看作事件(消息),如單擊鼠標(biāo)左鍵,發(fā)送單擊鼠標(biāo)左鍵事件,用戶按下鍵盤,發(fā)送鍵盤被按下的事件等。Windows操作系統(tǒng)統(tǒng)一負(fù)責(zé)管理所有的事件,根據(jù)具體情況把事件發(fā)送到相應(yīng)運(yùn)行程序,而各個(gè)運(yùn)行程序自動(dòng)用一個(gè)函數(shù)響應(yīng)事件,這個(gè)函數(shù)叫事件處理函數(shù)。這種方法叫事件驅(qū)動(dòng)。Windows操作系統(tǒng)在window.h文件中預(yù)定義了若干事件。在Form類和控件類中都定義了WndProc方法可截獲Windows消息,這是一個(gè)虛函數(shù)。在它們的派生類中可重寫WndProc方法,截獲Windows消息,見下例,方法中Message是一個(gè)結(jié)構(gòu),m.Msg為事件編號(hào),m.Wparam和m.LParam是事件的附加信息,事件不同,意義也不同。
第五十三頁(yè),編輯于星期六:七點(diǎn)三十九分。protectedoverridevoidWndProc(refMessagem){base.WndProc(refm);//調(diào)用基類事件處理函數(shù)if(m.Msg==0x0112&&(int)m.WParam==0xf060){…} //自定義處理事件代碼}第五十四頁(yè),編輯于星期六:七點(diǎn)三十九分。3.13.2事件的聲明
usingSystem;publicdelegatevoidChangedEvent(objectsender,EventArgse); //代表類聲明publicclassPerson{publ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 班主任在班級(jí)活動(dòng)中的引導(dǎo)角色計(jì)劃
- 合同范本音樂app
- 股骨頸骨折護(hù)理查房
- 班級(jí)班規(guī)的制定與執(zhí)行計(jì)劃
- 2025年自然拼讀2級(jí)標(biāo)準(zhǔn)課件材料
- 學(xué)校周邊安全環(huán)境的構(gòu)建計(jì)劃
- 建立有效的會(huì)議記錄機(jī)制計(jì)劃
- 第3課 中華文明的起源2024-2025學(xué)年新教材七年級(jí)上冊(cè)歷史新教學(xué)設(shè)計(jì)(統(tǒng)編版2024)
- 以活動(dòng)促學(xué)習(xí)的班級(jí)實(shí)踐計(jì)劃
- 《貴州水城礦業(yè)股份有限公司水城縣米籮煤礦(新立一期)(延續(xù))礦產(chǎn)資源綠色開發(fā)利用方案(三合一)》評(píng)審意見
- 壓力容器安全風(fēng)險(xiǎn)管控清單(日管控、周排查、月調(diào)度)
- 麻醉性鎮(zhèn)痛藥物的處方點(diǎn)評(píng)
- 2023年電腦印刷設(shè)計(jì)考試題庫(kù)及答案
- 《C4D》課程教學(xué)標(biāo)準(zhǔn)
- 2024年遼寧鐵道職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 養(yǎng)肝護(hù)肝科普課件
- 康復(fù)科護(hù)士的康復(fù)護(hù)理計(jì)劃的個(gè)性化制定
- 小學(xué)英語(yǔ)新思維朗文2A知識(shí)清單總結(jié)期末復(fù)習(xí)資料
- 《京劇的角色》課件
- 幼兒園大班科學(xué)《7的組成和分解》
- 《項(xiàng)脊軒志》公開課課件【一等獎(jiǎng)】
評(píng)論
0/150
提交評(píng)論