C#面向?qū)ο缶幊袒A(chǔ)學習筆記_第1頁
C#面向?qū)ο缶幊袒A(chǔ)學習筆記_第2頁
C#面向?qū)ο缶幊袒A(chǔ)學習筆記_第3頁
C#面向?qū)ο缶幊袒A(chǔ)學習筆記_第4頁
C#面向?qū)ο缶幊袒A(chǔ)學習筆記_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C#面向?qū)ο缶幊袒A(chǔ)學習筆記第一頁,編輯于星期六:七點三十九分。3.1繼承在2.1.5節(jié),定義了一個描述個人情況的Person類。如需要描述一個雇員,當然可以從頭開始定義Employee類用來描述雇員。但這樣不能利用Person類中已定義的函數(shù)和數(shù)據(jù)。比較好的方法是以Person類為基類,派生出Employee類,Employee類繼承了Person類的數(shù)據(jù)成員和函數(shù)成員,既Person類的數(shù)據(jù)成員和函數(shù)成員成為Employee類的成員。這個Employee類叫以Person類為基類的派生類,這是C#提出的方法。C#用繼承的方法,實現(xiàn)代碼的重用。第二頁,編輯于星期六:七點三十九分。3.1.1派生類的聲明格式

派生類的聲明格式如下:

附加說明類修飾符class派生類名:基類名{類體}雇員類Employee定義如下:

classEmployee:Person{ privatestringdepartment; privatedecimalsalary; publicEmployee(stringName,intAge, stringD,decimalS):base(Name,Age) { department=D; salary=S; }

第三頁,編輯于星期六:七點三十九分。publicnewvoidDisplay()//注意new{ base.Display();//訪問基類的同名方法 Console.WriteLine(“部門:{0}薪金:{1}”, department,salary);}}主函數(shù)如下:classClass1{ staticvoidMain(string[]args) {EmployeeOneEmployee=newEmployee( “李四”,30,"計算機系",2000); OneEmployee.Display(); }}

第四頁,編輯于星期六:七點三十九分。3.1.2隱藏基類方法

在派生類中,可以聲明與基類完全相同的新方法,完全相同是指和基類方法的函數(shù)類型、函數(shù)名、參數(shù)類型和個數(shù)都相同。如上例中的方法Display()。這樣做不算錯誤,但會導致編譯器發(fā)出警告。如果增加new修飾符,表示認可,編譯器不再發(fā)出警告。請注意,聲明與基類完全相同新方法,并不是移走基類同名方法,只是在派生類中必須用如下格式訪問基類中同名方法:base.Display();也就是說派生類的新方法隱藏了基類同名方法。

第五頁,編輯于星期六:七點三十九分。3.1.3base關(guān)鍵字

base關(guān)鍵字用于從派生類中訪問基類成員,它有兩種基本用法:

在定義派生類的構(gòu)造函數(shù)中,指明要調(diào)用的基類構(gòu)造函數(shù),由于基類可能有多個構(gòu)造函數(shù),根據(jù)base后的參數(shù)類型和個數(shù),指明要調(diào)用哪一個基類構(gòu)造函數(shù)。在派生類的方法中調(diào)用基類中被派生類隱藏的方法。

第六頁,編輯于星期六:七點三十九分。3.1.4C#語言類繼承特點

C#語言只允許單繼承,即派生類只能有一個基類。

C#語言繼承是可以傳遞的,如果C從B派生,B從A派生,那么C不但繼承B的成員,還要繼承A中的成員。派生類可以添加新成員,但不能刪除基類中的成員派生類不繼承基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)。能繼承基類的屬性。派生類可以隱藏基類的同名成員,如果在派生類中隱藏了基類同名成員,基類該成員在派生類中就不能被直接訪問,只能通過base.基類方法名訪問。派生類對象也是其基類的對象,但基類對象卻不一定是其派生類的對象。例如,前邊定義的雇員類Employee是Person類的派生類,所有雇員都是Person類的成員,但很多Person類的成員并不是雇員,可能是學生、自由職業(yè)者、兒童等。因此C#語言規(guī)定,基類的引用變量可以引用其派生類對象,但派生類的引用變量不可以引用其基類對象。

第七頁,編輯于星期六:七點三十九分。3.2類的成員

由于C#程序中每個變量或函數(shù)都必須屬于一個類或結(jié)構(gòu),不能象C或C++那樣建立全局變量,因此所有的變量或函數(shù)都是類或結(jié)構(gòu)的成員。類的成員可以分為兩大類:類本身所聲明的以及從基類中繼承來的。

第八頁,編輯于星期六:七點三十九分。3.2.1類的成員類型

類的成員包括以下類型局部變量:在for、switch等語句中和類方法中定義的變量

字段:即類中的變量或常量,包括靜態(tài)字段、實例字段、常量 和只讀字段。方法成員:即類中的方法,包括靜態(tài)方法和實例方法。

屬性:按屬性指定的get方法和set方法對字段進行讀寫。屬 性本質(zhì)上是方法。事件:代表事件本身,同時是事件處理函數(shù)的代表。索引指示器:允許象數(shù)組那樣使用索引訪問類中的數(shù)據(jù)成員。重載操作符:采用重載操作符的方法定義類中特有的操作。構(gòu)造函數(shù)和析構(gòu)函數(shù)。

第九頁,編輯于星期六:七點三十九分。3.2.2類成員訪問修飾符

訪問修飾符有4種,用于指定類成員的可訪問性:

Private:protected:public:Internal:內(nèi)部成員只能在同一程序集中的文件中才是可以訪問的,一般是同一個應用(Application)或庫(Library)。

第十頁,編輯于星期六:七點三十九分。3.3類的字段和屬性

一般把類或結(jié)構(gòu)中定義的變量和常量叫字段。屬性不是字段,本質(zhì)上是定義修改字段的方法,由于屬性和字段的緊密關(guān)系,把它們放到一起敘述。

第十一頁,編輯于星期六:七點三十九分。3.3.1靜態(tài)字段、實例字段、常量和只讀字段

見下例:publicclassTest{publicconstintintMax=int.MaxValue;//常量必須賦初值publicintx=0; //實例字段,每個實例創(chuàng)建不同xpublicreadonlyinty=0;//只讀字段,每個實例創(chuàng)建不同ypublicstaticintcnt=0;//靜態(tài)字段,所有實例共用一個cntpublicTest(intx1,inty1) //構(gòu)造函數(shù){ //intMax=0;錯誤,在構(gòu)造函數(shù)不能修改常量 x=x1; //在構(gòu)造函數(shù)允許修改實例字段 y=y1; //在構(gòu)造函數(shù)允許修改只讀字段 cnt++;//每創(chuàng)建一個對象都調(diào)用構(gòu)造函數(shù), //用此語句可以記錄對象的個數(shù)}

第十二頁,編輯于星期六:七點三十九分。publicvoidModify(intx1,inty1){ //intMax=0;和y=10;錯誤,不能修改常量和只讀字段 x=x1; cnt=y1;}}classClass1{ staticvoidMain(string[]args){ TestT1=newTest(100,200); T1.x=40;//引用實例字段方法:實例名.實例字段名 Tt=0;//引用靜態(tài)字段方法:類名.靜態(tài)字段名 intz=T1.y; //引用只讀字段 z=TMax; //引用常量}}第十三頁,編輯于星期六:七點三十九分。3.3.2屬性

C#語言支持組件編程,組件也是類,組件用屬性、方法、事件描述。屬性不是字段,但必然和類中的某個或某些字段相聯(lián)系,屬性定義了得到和修改相聯(lián)系的字段的方法。C#中的屬性更充分地體現(xiàn)了對象的封裝性:不直接操作類的數(shù)據(jù)內(nèi)容,而是通過訪問器進行訪問,借助于get和set方法對屬性的值進行讀寫。訪問屬性值的語法形式和訪問一個變量基本一樣,使訪問屬性就象訪問變量一樣方便,符合習慣。在類的基本概念一節(jié)中,定義一個描述個人情況的類Person,其中字段name和age是私有字段,記錄姓名和年齡,外部通過公有方法SetName和SetAge修改這兩個私有字段?,F(xià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; } }}第十五頁,編輯于星期六:七點三十九分。publicclassTest{ publicstaticvoidMain(){ PersonOnePerson=newPerson(); OnePerson.Name="田七";//通過set方法修改變量P_Name strings=OnePerson.Name;//通過get方法得到變量P_Name值

//下句錯誤Test不是Person派生類,不能修改Age屬性 //OnePerson.Age=20; intx=OnePerson.Age;//通過定義屬性,既保證了姓名 //和年齡按指定方法修改 OnePerson.Display();//語法形式和修改、 //得到一個變量基本一致,符合習慣}} 只有set訪問器的屬性值只能進行設(shè)置而不能讀出,只有g(shù)et訪問器的屬性值是只讀的,不能改寫,同時具有set和get訪問器表明屬性值的讀寫都是允許的。

第十六頁,編輯于星期六:七點三十九分。3.4類的方法3.4.1方法的聲明

方法的聲明格式如下:方法修飾符返回類型方法名(形參列表){方法體}

3.4.2方法中參數(shù)的傳遞值參數(shù),不含任何修飾符(值類型、引用類型不同)

引用參數(shù),以ref修飾符聲明(主要用于值類型)輸出參數(shù),以out修飾符聲明(主要用于值類型)usingSystem;classg{publicinta=0;}//類定義

第十七頁,編輯于星期六:七點三十九分。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";第十八頁,編輯于星期六:七點三十九分。 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ù),但實參是一個類引用類型變量 Console.WriteLine(g1.a.ToString());//顯示:20修改對象數(shù)據(jù) F6(refs1);//引用參數(shù),參數(shù)類型是字符串,s1為字符串引用變量 Console.WriteLine(s1);//顯示:xyz,字符串s1被修改 }}第十九頁,編輯于星期六:七點三十九分。數(shù)組參數(shù),以params修飾符聲明,數(shù)組參數(shù)使用params說明,如果形參表中包含了數(shù)組參數(shù),那么它必須是參數(shù)表中最后一個參數(shù),數(shù)組參數(shù)只允許是一維數(shù)組。usingSystem;classClass1{ staticvoidF(paramsint[]args) //數(shù)組參數(shù) { Console.Write(“數(shù)組包含{0}個元素:”, args.Length); foreach(intiinargs) Console.Write("{0}",i); }第二十頁,編輯于星期六:七點三十九分。staticvoidMain(string[]args){int[]a={1,2,3}; F(a); //實參為數(shù)組類引用變量a F(10,20,30,40);//等價于F(newint[]{10,20,30,40}) F(newint[]{60,70,80,90});//實參為數(shù)組類引用 F(); //等價于F(newint[]{}); F(newint[]{});//實參為數(shù)組類引用,數(shù)組無元素}}程序輸出數(shù)組包含3個元素:123數(shù)組包含4個元素:10203040數(shù)組包含4個元素:60,70,80,90數(shù)組包含0個元素:數(shù)組包含0個元素:

第二十一頁,編輯于星期六:七點三十九分。 方法的參數(shù)為數(shù)組時也可以不使用params,此種方法可以使用一維或多維數(shù)組,見下例:usingSystem;classClass1{ staticvoidF(int[,]args)//值參數(shù)類型為數(shù)組類引用變量 { Console.Write("數(shù)組包含{0}個元素:",args.Length); foreach(intiinargs) Console.Write("{0}",i); } staticvoidMain(string[]args) { int[,]a={{1,2,3},{4,5,6}}; F(a); //實參為數(shù)組類引用變量a//F(10,20,30,40);F();F(newint[,]{});這兩種格式不能使用 F(newint[,]{{60,70},{80,90}});//實參為數(shù)組類引用 }}

第二十二頁,編輯于星期六:七點三十九分。3.4.3靜態(tài)方法和實例方法

用修飾符static聲明的方法為靜態(tài)方法

不管類生成或未生成對象,類的靜態(tài)方法都可以被使用,使用格式為:類名.靜態(tài)方法名。靜態(tài)方法只能使用該靜態(tài)方法所在類的靜態(tài)數(shù)據(jù)成員和靜態(tài)方法。這是因為使用靜態(tài)方法時,該靜態(tài)方法所在類可能還沒有對象不用修飾符static聲明的方法為實例方法

在類創(chuàng)建對象后,實例方法才能被使用,使用格式為:對象名.實例方法名。實例方法可以使用該方法所在類的所有靜態(tài)成員和實例成員。例子如下:

第二十三頁,編輯于星期六:七點三十九分。usingSystem;publicclassUseMethod{ privatestaticintx=0;//靜態(tài)字段privateinty=1;//實例字段publicstaticvoidStaticMethod()//靜態(tài)方法{ x=10; //正確,靜態(tài)方法訪問靜態(tài)數(shù)據(jù)成員 //y=20;錯誤,靜態(tài)方法不能訪問實例數(shù)據(jù)成員}publicvoidNoStaticMethod()//實例方法{ x=10; //正確,實例方法訪問靜態(tài)數(shù)據(jù)成員y=20; //正確,實例方法訪問實例數(shù)據(jù)成員}}第二十四頁,編輯于星期六:七點三十九分。publicclassClass1{ publicstaticvoidMain(){ UseMethodm=newUseMethod();//使用靜態(tài)方法格式為:類名.靜態(tài)方法名 UseMethod.StaticMethod(); //使用實例方法格式為:對象名.實例方法名 m.NoStaticMethod();}}第二十五頁,編輯于星期六:七點三十九分。3.4.4操作符重載

usingSystem;classComplex //復數(shù)類定義{ privatedoubleReal; //復數(shù)實部 privatedoubleImag; //復數(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); }}第二十六頁,編輯于星期六:七點三十九分。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; //等價于z=opeator-(x) z.Display(); //顯示:-1+(-2)j z=x+y; //即z=opeator+(x,y) z.Display(); //顯示:4+(6)j }}第二十七頁,編輯于星期六:七點三十九分。3.4.5this關(guān)鍵字

每個類都可以有多個對象,例如定義Person類的兩個對象:PersonP1=newPerson("李四",30);PersonP2=newPerson("張三",40);因此P1.Display()應顯示李四信息,P2.Display()應顯示張三信息,但無論創(chuàng)建多少個對象,只有一個方法Display(),該方法是如何知道顯示哪個對象的信息的呢?C#語言用引用變量this記錄調(diào)用方法Display()的對象,當某個對象調(diào)用方法Display()時,this便引用該對象(記錄該對象的地址)。

第二十八頁,編輯于星期六:七點三十九分。3.5類的多態(tài)性

C#支持兩種類型的多態(tài)性編譯時的多態(tài)性

編譯時的多態(tài)性是通過方法重載來實現(xiàn)的。

運行時的多態(tài)性

是在系統(tǒng)運行時,不同對象調(diào)用一個名字相同,參數(shù)的類型及個數(shù)完全一樣的方法,會完成不同的操作。C#運行時的多態(tài)性通過虛方法實現(xiàn)。在類的方法聲明前加上了virtual修飾符,被稱之為虛方法,反之為非虛方法。

第二十九頁,編輯于星期六:七點三十九分。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"); }}第三十頁,編輯于星期六:七點三十九分。classTest{ staticvoidF2(AaA) //注意,參數(shù)為A類引用變量{ aA.G(); }staticvoidMain(){Bb=newB();Aa1=newA();Aa2=b;//允許基類引用變量引用派生類對象a2引用派生類B對象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對象,調(diào)用基類A的G,顯示A.Ga2.G();//G為虛方法,a2引用派生類B對象,調(diào)用派生類B的G,顯示B.GF2(b);//實參為派生類B對象,AaA=b,調(diào)用派生類B的函數(shù)G,顯示B.GF2(a1);//實參為基類A對象,調(diào)用A類的函數(shù)G(),顯示A.G}}第三十一頁,編輯于星期六:七點三十九分。3.6作用域作用域又稱作用范圍,它指的是標識符可以使用的范圍。C#語言中,類(或結(jié)構(gòu))成員的作用域是整個類;方法內(nèi)聲明的局部變量(含局部常量)的作用域從它的聲明開始延續(xù)到包含它的塊尾。第三十二頁,編輯于星期六:七點三十九分。3.6.1類成員的作用域C#語言中類成員的作用域是整個類。因此,類定義中,成員之間的順序是任意的。例如:classTest{publicvoidMyMethod(){num++;Console.WriteLine(num);}privateintnum=0;}上例就把字段的聲明放在類體的尾部,而在前面定義了使用該字段的方法。第三十三頁,編輯于星期六:七點三十九分。3.6.2局部變量的作用域方法體內(nèi)聲明的變量稱為局部變量,局部變量的作用域從它的聲明開始延續(xù)到包含它的塊尾。例如:voidf1(){inti=100; //變量i作用域的起始處if(i>0){...intj=10; //變量j作用域的起始處...} //變量j作用域的結(jié)束處} //變量i作用域的結(jié)束處第三十四頁,編輯于星期六:七點三十九分。3.7抽象類和抽象方法

抽象類只能作為其他類的基類,它不能直接被實例化。

抽象類允許包含抽象方法,雖然這不是必須的。抽象方法用abstract修飾符修飾。

抽象類不能同時又是密封的。

抽象類的基類也可以是抽象類。如果一個非抽象類的基類是抽象類,則該類必須通過隱藏來實現(xiàn)所有繼承而來的抽象方法,包括其抽象基類中的抽象方法,如果該抽象基類從其他抽象類派生,還應包括其他抽象類中的所有抽象方法。

請看下面的示例:

第三十五頁,編輯于星期六:七點三十九分。usingSystem;abstractclassFigure//抽象類定義,表示一個抽象圖形{ protecteddoublex=0,y=0; publicFigure(doublea,doubleb) { x=a; y=b; }

//抽象方法,無實現(xiàn)代碼,抽象圖形無法計算面積publicabstractvoidArea();}classSquare:Figure //類Square定義,矩形類{ publicSquare(doublea,doubleb):base(a,b) {}publicoverridevoidArea()//不能使用new,必須用override{ Console.WriteLine("矩形面積是:{0}",x*y);}}第三十六頁,編輯于星期六:七點三十九分。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第三十七頁,編輯于星期六:七點三十九分。3.8密封類和密封方法

有時候,我們并不希望自己編寫的類被繼承?;蛘哂械念愐呀?jīng)沒有再被繼承的必要。C#提出了一個密封類(sealedclass)的概念,幫助開發(fā)人員來解決這一問題。密封類在聲明中使用sealed修飾符,這樣就可以防止該類被其他類繼承。如果試圖將一個密封類作為其他類的基類,C#編譯器將提示出錯。理所當然,密封類不能同時又是抽象類,因為抽象總是希望被繼承的。C#還提出了密封方法(sealedmethod)的概念。方法使用sealed修飾符,稱該方法是一個密封方法。在派生類中,不能重新定義基類中的密封方法。

第三十八頁,編輯于星期六:七點三十九分。3.9靜態(tài)類和靜態(tài)類成員

C#2.0中的類可以聲明為靜態(tài)的,例如staticclassMyClass{}表示MyClass類是靜態(tài)的。靜態(tài)類僅包含靜態(tài)成員,不能使用new創(chuàng)建靜態(tài)類的對象,靜態(tài)類必須是密封的,不能有構(gòu)造函數(shù)。靜態(tài)類在加載包含該類的程序或命名空間時由CLR自動加載。

第三十九頁,編輯于星期六:七點三十九分。3.10C#2.0中的分部類

分部類可將類、結(jié)構(gòu)或接口的定義拆分到兩個或多個源文件中。若要拆分類定義,被拆分類的每一部分的定義前邊都要用partial關(guān)鍵字修飾,類的每一部分定義可以存到不同源文件中,編譯應用程序時將把所有部分組合起來。VS2005生成的Windows應用程序框架采用了分部類的概念,F(xiàn)orm1類用分部類方法分成兩部分,在不同文件中,其中Form1.Designer.cs文件是由VS2005自動生成的代碼,自己編寫的代碼應放到Form1.cs文件中。

第四十頁,編輯于星期六:七點三十九分。3.11接口

在接口中可以聲明方法、屬性、索引指示器和事件,接口中并不提供它們的實現(xiàn)。因此接口是函數(shù)成員聲明的集合。如果類或結(jié)構(gòu)從一個接口派生,則這個類或結(jié)構(gòu)負責實現(xiàn)該接口中所聲明的所有函數(shù)成員。一個接口可以繼承多個接口,而一個類或結(jié)構(gòu)可以實現(xiàn)多個接口。由于C#語言不支持多繼承,因此,如果某個類需要繼承多個類的行為時,只能使用多個接口加以說明。第四十一頁,編輯于星期六:七點三十九分。3.11.1接口聲明

publicinterfaceIexample { //索引指示器聲明 stringthis[intindex]{get;set;} eventEventHandlerE; //事件聲明voidF(intvalue); //方法聲明stringP{get;set;} //屬性聲明} 首先接口成員只能是方法、屬性、索引指示器和事件。所有接口成員都不能包括實現(xiàn)。接口成員聲明不能包含任何修飾符,接口成員默認訪問方式是public。

第四十二頁,編輯于星期六:七點三十九分。3.11.2接口的繼承 類似于類的繼承性,接口也有繼承性。派生接口繼承了基接口中的函數(shù)成員說明。接口允許多繼承,一個派生接口可以沒有基接口,也可以有多個基接口。在接口聲明的冒號后列出被繼承的接口名字,多個接口名之間用分號分割。例子如下:

第四十三頁,編輯于星期六:七點三十九分。usingSystem;interfaceIControl{ voidPaint(); }//繼承了接口Icontrol的方法Paint()interfaceITextBox:Icontrol{ voidSetText(stringtext); }//繼承了接口Icontrol的方法Paint()interfaceIListBox:Icontrol{ voidSetItems(string[]items); }//繼承了接口Icontrol、ITextBox和IListBox的方法interfaceIComboBox:ITextBox,IListBox{ } //可以聲明新方法

第四十四頁,編輯于星期六:七點三十九分。3.11.3類對接口的實現(xiàn)

類實現(xiàn)接口的本質(zhì)是,用接口規(guī)定類應實現(xiàn)哪些函數(shù)成員。用類來實現(xiàn)接口時,接口的名稱必須包含在類聲明中的基類列表中。

在類的基本概念一節(jié)中,定義一個描述個人情況的類Person,從類Person可以派生出其他類,例如:工人類、公務員類、醫(yī)生類等。這些類有一些共有的方法和屬性,例如工資屬性。一般希望所有派生類訪問工資屬性時用同樣變量名。該屬性定義在類Person中不合適,因為有些人無工資,如小孩。如定義一個類作為基類,包含工資屬性,但C#不支持多繼承??尚械霓k法是使用接口,在接口中聲明工資屬性。工人類、公務員類、醫(yī)生類等都必須實現(xià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ī)生類等都要按以下方法實現(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();}}

第四十七頁,編輯于星期六:七點三十九分。 如果類繼承了某個接口,類也隱式地繼承了該接口的所有基接口,不管這些基接口有沒有在類聲明的基類表中列出。因此,如果類從一個接口派生,則這個類負責實現(xiàn)該接口及該接口的所有基接口中所聲明的所有成員。

第四十八頁,編輯于星期六:七點三十九分。3.12委托類型C#的一個新的引用數(shù)據(jù)類型:代表類型,也翻譯為委托類型。在功能上它類似C語言的函數(shù)指針,目的是通過創(chuàng)建代表類型對象去調(diào)用函數(shù)。使用代表類型的第一步,是從delegate類派生出一個代表類型,指明這個代表類型對象要代表的函數(shù)的返回值類型,參數(shù)的個數(shù)及類型,因此C#中的代表類型是類型安全的。聲明一個代表類型格式如下:修飾符delegate函數(shù)返回類型定義的代表標識符(函數(shù)形參列表);

例如我們可以聲明一個能代表返回類型為int,無參數(shù)的函數(shù)的代表類型,類型名為MyDelegate,類型聲明如下,只能代表返回類型為int,無參數(shù)的函數(shù)

publicdelegateintMyDelegate(); 聲明了代表類型MyDelegate,可創(chuàng)建代表類型MyDelegate的對象,用這個對象去代表一個靜態(tài)方法或非靜態(tài)的方法,所代表的方法必須為int類型,無參數(shù)??聪旅娴睦樱?/p>

第四十九頁,編輯于星期六:七點三十九分。usingSystem;delegateintMyDelegate();//聲明一個代表類型注意位置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對象,對象d代表了方法InstanceMethodMyDelegated=newMyDelegate(p.InstanceMethod); //參數(shù)是被代表的方法

第五十頁,編輯于星期六:七點三十九分。d();//因?qū)ο骴代表了方法InstanceMethod,調(diào)用非靜態(tài)方法//下條語句對象d代表了方法StaticMethod,參數(shù)是被代表的方法d=newMyDelegate(MyClass.StaticMethod); d();//因?qū)ο骴代表了方法StaticMethod,用此方式調(diào)用這個靜態(tài)方法}}程序的輸出結(jié)果是:調(diào)用了非靜態(tài)的方法。調(diào)用了靜態(tài)的方法。第五十一頁,編輯于星期六:七點三十九分。3.13事件

3.13.1事件驅(qū)動

事件是C#語言內(nèi)置的語法,可以定義和處理事件,為使用組件編程提供了良好的基礎(chǔ)。

Windows應用程序和dos程序的最大不同是采用事件驅(qū)動方式工作,也叫消息驅(qū)動。dos程序如要從鍵盤輸入數(shù)據(jù),則要獨占鍵盤等待用戶輸入,如用戶不輸入,則CPU一直執(zhí)行鍵盤輸入程序,等待用戶輸入,即dos程序獨占外設(shè)和CPU。Windows操作系統(tǒng)是一個多任務的操作系統(tǒng),允許同時運行多個程序,它不允許任何一個程序獨占外設(shè),如鍵盤、鼠標等,所有運行程序共享外設(shè)和CPU,各個運行程序都要隨時準備從外設(shè)接受命令,執(zhí)行命令。因此必須由Windows操作系統(tǒng)統(tǒng)一管理各種外設(shè)。

第五十二頁,編輯于星期六:七點三十九分。 Windows把用戶對外設(shè)的動作都看作事件(消息),如單擊鼠標左鍵,發(fā)送單擊鼠標左鍵事件,用戶按下鍵盤,發(fā)送鍵盤被按下的事件等。Windows操作系統(tǒng)統(tǒng)一負責管理所有的事件,根據(jù)具體情況把事件發(fā)送到相應運行程序,而各個運行程序自動用一個函數(shù)響應事件,這個函數(shù)叫事件處理函數(shù)。這種方法叫事件驅(qū)動。Windows操作系統(tǒng)在window.h文件中預定義了若干事件。在Form類和控件類中都定義了WndProc方法可截獲Windows消息,這是一個虛函數(shù)。在它們的派生類中可重寫WndProc方法,截獲Windows消息,見下例,方法中Message是一個結(jié)構(gòu),m.Msg為事件編號,m.Wparam和m.LParam是事件的附加信息,事件不同,意義也不同。

第五十三頁,編輯于星期六:七點三十九分。protectedoverridevoidWndProc(refMessagem){base.WndProc(refm);//調(diào)用基類事件處理函數(shù)if(m.Msg==0x0112&&(int)m.WParam==0xf060){…} //自定義處理事件代碼}第五十四頁,編輯于星期六:七點三十九分。3.13.2事件的聲明

usingSystem;publicdelegatevoidChangedEvent(objectsender,EventArgse); //代表類聲明publicclassPerson{publ

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論