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

下載本文檔

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

文檔簡介

第二章面向?qū)ο蟪绦蛟O(shè)計(jì)2目錄2.1面向?qū)ο蟮母舅枷?.2類與對象2.3類的方法與重載2.4域、屬性和索引2.5繼承與多態(tài)2.6抽象類與接口2.7委托與事件2.2類與對象類的定義定義形式修飾符〔可訪問性修飾符〕類的成員類成員靜態(tài)成員和實(shí)例成員創(chuàng)立對象與構(gòu)造函數(shù)對象的生存期構(gòu)造函數(shù)及重載2.2.1類的定義類使用class關(guān)鍵字聲明。形式如下:

[類修飾符]class

類名[:基類以及實(shí)現(xiàn)的接口列表]{

類體//定義字段、屬性、方法、事件等類成員}類修飾符:用于對類的可訪問性、abstract、static、virtual等特性進(jìn)行聲明。可訪問性:定義類、成員的可訪問級別,用來控制是否能在其他類中或其他程序文件中使用它們,包括public、internal、protected、private關(guān)鍵字2.2.1類的定義public

classPerson{public

stringname;//Field

publicPerson()//Constructor

{name="unknown";}

public

voidSetName(stringnewName)//Method

{name=newName;}}classTestPerson{

static

voidMain(){Personperson=newPerson();Console.WriteLine();

person.SetName("JohnSmith");Console.WriteLine();}/*Output:unknownJohnSmith*/

2.2.1類的定義可訪問性修飾符:4個關(guān)鍵字構(gòu)成了5種可訪問級別修飾符既可用于類特性、又可用于類成員特性的聲明。如:static用于類聲明時,說明該類是一個靜態(tài)類;當(dāng)用于類中的方法成員時,說明該方法是一個靜態(tài)方法。本小節(jié)主要說明可訪問修飾符,abstract、sealed、static、virtual等修飾符將在后續(xù)各節(jié)說明。2.2.1類的定義public訪問修飾符classPointTest{

public

intx;

public

inty;}classMainClass4{

static

voidMain(){PointTestp=newPointTest();

//Directaccesstopublicmembers:

p.x=10;p.y=15;Console.WriteLine("x={0},y={1}",p.x,p.y);}}//Output:x=10,y=15

2.2.1類的定義protected訪問修飾符classA{protectedintx=123;}classB:A{staticvoidMain(){Aa=newA();Bb=newB();

//ErrorCS1540,becausexcanonlybeaccessedby

//classesderivedfromA.

//a.x=10;

//OK,becausethisclassderivesfromA.

b.x=10;}}

2.2.1類的定義internal訪問修飾符//Assembly1.csinternalclassBaseClass{

publicstaticintintM=0;}//Assembly1_a.csclassTestAccess{

staticvoidMain(){

BaseClassmyBase=newBaseClass();

//error}}2.2.1類的定義private訪問修飾符classPrivateTest{

static

voidMain(){Employee2e=newEmployee2();

//Thedatamembersareinaccessible(private),so

//theycan'tbeaccessedlikethis:

//stringn=;

//doubles=e.salary;

//'name'isindirectlyaccessedviamethod:

stringn=e.GetName();

//'salary'isindirectlyaccessedviaproperty

doubles=e.Salary;}}

classEmployee2{

private

stringname="FirstName,LastName";

private

doublesalary=100.0;

public

stringGetName(){

returnname;}

public

doubleSalary{

get{returnsalary;}}}2.2.1類的定義假設(shè)未指定訪問修飾符,那么使用默認(rèn)的可訪問性。類的默認(rèn)可訪問性是internal;類成員的默認(rèn)可訪問性是private。枚舉、接口、結(jié)構(gòu)及各自成員也具有可訪問性枚舉、接口、結(jié)構(gòu)的默認(rèn)可訪問性與類相同;它們成員的默認(rèn)可訪問性見:://msdn.microsoft/zh-cn/library/ba0a1yw2(v=vs.100).aspx2.2.2類的成員類的成員包括類中聲明的所有成員:字段〔field〕:是在類內(nèi)聲明的變量。字段可以是內(nèi)置數(shù)值類型或其他類的實(shí)例。常量〔const〕:在類內(nèi)聲明的符號常量。屬性〔property〕:可以像類中字段一樣訪問的方法,屬性通過稱作“訪問器〞的特殊方法為類字段值的更改提供保護(hù)。方法〔method〕:即類內(nèi)聲明的函數(shù),定義類可以執(zhí)行的操作,方法可以有輸入?yún)?shù)、也可有返回值。構(gòu)造函數(shù)〔constructor〕:一種特殊的方法,是類實(shí)例化時〔即創(chuàng)立對象變量時〕自動調(diào)用的方法,通常用于對象的數(shù)據(jù)初始化。2.2.2類的成員類的成員包括類中聲明的所有成員:析構(gòu)函數(shù)〔destructor〕:一種特殊的方法,用于對象變量不再使用后的資源釋放等工作,c#中一般不需顯式釋放。運(yùn)算符重載〔operatoroverloading〕:更改運(yùn)算符的行為。在重載運(yùn)算符時,在類中將該運(yùn)算符定義為公共靜態(tài)方法。索引器〔indexor〕:使類的實(shí)例可按與數(shù)組相同的〔語法〕方式進(jìn)行訪問。事件〔event〕:向其他對象提供有關(guān)發(fā)生事情〔如單擊按鈕或成功完成某個方法〕的通知。事件是使用委托定義和觸發(fā)的。2.2.2類的成員publicclassPerson{privatestringname;publicstringName{get{returnname;}set{name=value;}}publicPerson(stringname){=name;}publicvoidTalk(){Console.WriteLine(“name:{0}〞,name);}}FieldMethodPropertyConstructor2.2.2類的成員靜態(tài)成員與實(shí)例成員使用static修飾符的成員為靜態(tài)成員,反之為非靜態(tài)成員〔即實(shí)例成員〕。靜態(tài)成員屬于類而不屬于類的任何實(shí)例,始終通過類名訪問靜態(tài)成員;而實(shí)例成員屬于某個特定的實(shí)例,要通過對象名訪問。靜態(tài)成員----靜態(tài)字段:常用于存儲必須在所有實(shí)例之間共享的值。2.2.2類的成員靜態(tài)成員----靜態(tài)方法靜態(tài)方法、靜態(tài)屬性只能使用類的靜態(tài)成員;實(shí)例方法既可以使用類的靜態(tài)成員,也可以使用類的非靜態(tài)成員?!纠?-1】雇員類。publicclassPerson{

publicintage;privatestaticstringname=

"c#";

publicstaticstringName{get

{returnname;}set

{name=value;}}publicstaticvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}2.2.2類的成員classProgram{

staticvoidMain(){

Person.SayHello();Person.Name=

"Zhang";

Person.SayHello();}}publicclassPerson{

public

intage;privatestaticstringname=

"c#";

publicstaticstringName{get

{returnname;}set

{name=value;}}publicstaticvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}2.2.2類的成員classProgram{

staticvoidMain(){

Person.SayHello();Person.Name=

"Zhang";

Person.SayHello();

Person.age=20;

Person.TellAge();}}publicclassPerson{

public

intage;privatestaticstringname=

"c#";

publicstaticstringName{get

{returnname;}set

{name=value;}}publicstaticvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}2.2.2類的成員classProgram{

staticvoidMain(){Person.Name=

"Zhang";

Person.SayHello();

Personp1=

newPerson();p1.age=20;p1.TellAge();}}publicclassPerson{

public

intage;privatestaticstringname=

"c#";

publicstaticstringName{get

{returnname;}set

{name=value;}}publicstaticvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}2.2.2類的成員classProgram{

staticvoidMain(){Personp1=

newPerson();

p1.age=20;

p1.Name=

"Zhang";p1.TellAge();

//Person.SayHello();

}}靜態(tài)類:類也可聲明為靜態(tài)類,但靜態(tài)類不能實(shí)例化,即不能使用new關(guān)鍵字創(chuàng)立靜態(tài)類的變量,須使用類名本身訪問靜態(tài)類的成員。主要特征:僅包含靜態(tài)成員。無法實(shí)例化。是密封的〔即不可被繼承〕。不能包含實(shí)例構(gòu)造函數(shù)。靜態(tài)類主要作為一些公共方法集的容器。如:.NetFramework的數(shù)學(xué)運(yùn)算靜態(tài)類System.Math。2.2.2類的成員2.2.3創(chuàng)立對象與構(gòu)造函數(shù)創(chuàng)立對象類聲明后,可以創(chuàng)立類的實(shí)例,即對象變量。創(chuàng)立類實(shí)例使用new關(guān)鍵字,格式如下:類名對象名=new構(gòu)造函數(shù)(參數(shù)類表);如:PointmyPoint=newPoint();注:靜態(tài)類不能實(shí)例化。對象的生存期當(dāng)使用new創(chuàng)立時,對象開始存在;當(dāng)對象變量超出其作用域或?qū)ο笞兞?null時,那么對象變量消失,并由系統(tǒng)垃圾回收器回收其所占內(nèi)存資源。2.2.3創(chuàng)立對象與構(gòu)造函數(shù)對象的生存期當(dāng)對象創(chuàng)立時,系統(tǒng)自動調(diào)用其構(gòu)造函數(shù)為對象分配存儲空間。假設(shè)相應(yīng)類無自定義構(gòu)造函數(shù),那么系統(tǒng)自動生成一個默認(rèn)的無參構(gòu)造函數(shù);假設(shè)需進(jìn)行相關(guān)初始化操作〔如對類的成員賦值等〕,那么需自定義構(gòu)造函數(shù)。當(dāng)對象消失時,系統(tǒng)自動調(diào)用其析構(gòu)函數(shù)完成去除工作。一般不用自定義析構(gòu)函數(shù),假設(shè)在對象消失前需完成一些收尾工作〔如:保存數(shù)據(jù)到文件、輸出提示信息等〕,那么需自定義析構(gòu)函數(shù)。2.2.3創(chuàng)立對象與構(gòu)造函數(shù)構(gòu)造函數(shù)及其重載構(gòu)造函數(shù)遵循如下規(guī)定:構(gòu)造函數(shù)的函數(shù)名與類的名稱一樣,構(gòu)造函數(shù)沒有返回值及返回類型;一個類可以有多個構(gòu)造函數(shù)〔即構(gòu)造函數(shù)可以被重載〕;當(dāng)類沒有構(gòu)造函數(shù)時,那么自動生成一個默認(rèn)的無參構(gòu)造函數(shù),并使用默認(rèn)值初始化對象的字段〔例如,int將初始化為0〕;反之,當(dāng)類有構(gòu)造函數(shù)時,那么不會自動生成默認(rèn)構(gòu)造函數(shù)。2.2.3創(chuàng)立對象與構(gòu)造函數(shù)構(gòu)造函數(shù)及其重載【例】無自定義構(gòu)造函數(shù)。public

classPerson{

public

intage;

public

stringname;}classTestPerson{

static

voidMain(){Personperson=newPerson();Console.WriteLine("Name:{0},Age:{1}",,person.age);}}//Output:Name:,Age:0

構(gòu)造函數(shù)及其重載【例2-2】多個構(gòu)造函數(shù)。2.2.3創(chuàng)立對象與構(gòu)造函數(shù)classCoOrds{publicintx,y;

//無參構(gòu)造函數(shù):

publicCoOrds(){x=0;y=0;}

//帶兩個參數(shù)的構(gòu)造函數(shù):

publicCoOrds(intx,inty){this.x=x;this.y=y;}

//OverridetheToStringmethod:

publicoverridestringToString(){return(String.Format("({0},{1})",x,y));}}classMainClass{staticvoidMain(){CoOrdsp1=newCoOrds();CoOrdsp2=newCoOrds(5,3);

//DisplaytheresultsusingtheoverridenToStringmethod:

Console.WriteLine("Point#1at({0},{1})",p1.x,p1.y);Console.WriteLine("Point#2at{0}",p2);}}/*Output:Point#1at(0,0)Point#2at(5,3)*/

2.2.3創(chuàng)立對象與構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)執(zhí)行順序派生類在實(shí)例化生成對象時自頂向下依次調(diào)用其各級基類的構(gòu)造函數(shù)〔即根基類的構(gòu)造函數(shù)System.Object.Object()最先被調(diào)用〕,最后調(diào)用自己的構(gòu)造函數(shù)。默認(rèn)調(diào)用基類的無參構(gòu)造函數(shù)〔即默認(rèn)構(gòu)造函數(shù)〕,或者說:默認(rèn)調(diào)用基類的默認(rèn)構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)執(zhí)行順序【例2-3】2.2.3創(chuàng)立對象與構(gòu)造函數(shù)classProgram{staticvoidMain(string[]args){MyDerivedClassa=newMyDerivedClass();Console.WriteLine();//空一行MyDerivedClassb=newMyDerivedClass(100);Console.WriteLine();//空一行MyDerivedClassc=newMyDerivedClass(100,-100);}}//基類publicclassMyBaseClass{

publicMyBaseClass(){

Console.WriteLine("基類的無參構(gòu)造函數(shù)");}

publicMyBaseClass(inti){

Console.WriteLine("基類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}}//派生類publicclassMyDerivedClass:MyBaseClass{

publicMyDerivedClass(){

Console.WriteLine("派生類的無參構(gòu)造函數(shù)");}

publicMyDerivedClass(inti){

Console.WriteLine("派生類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}

publicMyDerivedClass(inti,intj){

Console.WriteLine("派生類的2個參數(shù)構(gòu)造函數(shù),i={0},j={0}",i,j);}}執(zhí)行順序:System.Object.Object();MyBaseClass.MyBaseClass();MyDerivedClass.相應(yīng)構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)執(zhí)行順序【例2-3】2.2.3創(chuàng)立對象與構(gòu)造函數(shù)//基類publicclassMyBaseClass{//publicMyBaseClass()//{//Console.WriteLine("基類的無參構(gòu)造函數(shù)");//}

publicMyBaseClass(inti){

Console.WriteLine("基類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}}//派生類publicclassMyDerivedClass:MyBaseClass{

publicMyDerivedClass(){

Console.WriteLine("派生類的無參構(gòu)造函數(shù)");}

publicMyDerivedClass(inti){

Console.WriteLine("派生類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}

publicMyDerivedClass(inti,intj){

Console.WriteLine("派生類的2個參數(shù)構(gòu)造函數(shù),i={0},j={0}",i,j);}}classProgram{staticvoidMain(string[]args){MyDerivedClassa=newMyDerivedClass();Console.WriteLine();//空一行MyDerivedClassb=newMyDerivedClass(100);Console.WriteLine();//空一行MyDerivedClassc=newMyDerivedClass(100,-100);}}2.2.3創(chuàng)立對象與構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)執(zhí)行順序關(guān)鍵字base可指定調(diào)用基類的某個構(gòu)造函數(shù)。除base關(guān)鍵字外,還可使用另一個關(guān)鍵字this,調(diào)用同一類的另一個構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)執(zhí)行順序【例2-3】2.2.3創(chuàng)立對象與構(gòu)造函數(shù)classProgram{staticvoidMain(string[]args){MyDerivedClassc=newMyDerivedClass(100,-100);}}//基類publicclassMyBaseClass{

publicMyBaseClass(){

Console.WriteLine("基類的無參構(gòu)造函數(shù)");}

publicMyBaseClass(inti){

Console.WriteLine("基類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}}//派生類publicclassMyDerivedClass:MyBaseClass{

publicMyDerivedClass(){

Console.WriteLine("派生類的無參構(gòu)造函數(shù)");}

publicMyDerivedClass(inti){

Console.WriteLine("派生類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}

publicMyDerivedClass(inti,intj):base(i){

Console.WriteLine("派生類的2個參數(shù)構(gòu)造函數(shù),i={0},j={0}",i,j);}}派生類的構(gòu)造函數(shù)執(zhí)行順序【例2-3】2.2.3創(chuàng)立對象與構(gòu)造函數(shù)classProgram{staticvoidMain(string[]args){MyDerivedClassc=newMyDerivedClass(100,-100);}}//基類publicclassMyBaseClass{

publicMyBaseClass(){

Console.WriteLine("基類的無參構(gòu)造函數(shù)");}

publicMyBaseClass(inti){

Console.WriteLine("基類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}}//派生類publicclassMyDerivedClass:MyBaseClass{

publicMyDerivedClass(){

Console.WriteLine("派生類的無參構(gòu)造函數(shù)");}

publicMyDerivedClass(inti){

Console.WriteLine("派生類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}

publicMyDerivedClass(inti,intj):base(10){

Console.WriteLine("派生類的2個參數(shù)構(gòu)造函數(shù),i={0},j={0}",i,j);}}2.2.3創(chuàng)立對象與構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)執(zhí)行順序【例2-3】//基類publicclassMyBaseClass{

publicMyBaseClass(){

Console.WriteLine("基類的無參構(gòu)造函數(shù)");}

publicMyBaseClass(inti){

Console.WriteLine("基類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}}//派生類publicclassMyDerivedClass:MyBaseClass{

publicMyDerivedClass(){

Console.WriteLine("派生類的無參構(gòu)造函數(shù)");}

publicMyDerivedClass(inti){

Console.WriteLine("派生類的1個參數(shù)構(gòu)造函數(shù),i={0}",i);}

publicMyDerivedClass(inti,intj):this(i){

Console.WriteLine("派生類的2個參數(shù)構(gòu)造函數(shù),i={0},j={0}",i,j);}}classProgram{staticvoidMain(string[]args){MyDerivedClassc=newMyDerivedClass(100,-100);}}2.2.3創(chuàng)立對象與構(gòu)造函數(shù)派生類的析構(gòu)函數(shù)執(zhí)行順序先執(zhí)行自己的析構(gòu)函數(shù),再自底向上依次執(zhí)行各基類的析構(gòu)函數(shù),最后執(zhí)行根基類System.Object的析構(gòu)函數(shù)。一個類只能有一個析構(gòu)函數(shù),無法重載析構(gòu)函數(shù),析構(gòu)函數(shù)既沒有參數(shù)、也沒有修飾符,析構(gòu)函數(shù)在對象消失時將被自動調(diào)用。一般不需自己編寫析構(gòu)函數(shù)。2.2.3創(chuàng)立對象與構(gòu)造函數(shù)派生類的析構(gòu)函數(shù)執(zhí)行順序classFirst{~First(){Console.WriteLine("First'sdestructoriscalled.");}}classSecond:First{~Second(){Console.WriteLine("Second'sdestructoriscalled.");}}classThird:Second{~Third(){Console.WriteLine("Third'sdestructoriscalled.");}}classTestDestructors{

static

voidMain(){Thirdt=newThird();}}2.3類的方法與重載方法的定義方法的參數(shù)類型靜態(tài)方法和實(shí)例方法方法重載運(yùn)算符重載this關(guān)鍵字2.3.1方法的定義在c#中,數(shù)據(jù)和操作均封裝在類中,數(shù)據(jù)是以類字段、常量、屬性的形式出現(xiàn),而操作主要表達(dá)在方法上。方法的一般格式為:[方法修飾符]返回值類型方法名([參數(shù)列表]){方法體}方法修飾符與類修飾符一樣,既包括public、internal、protected、private等訪問級別,也包括static、abstract、virtual、override等修飾符。2.3.2方法的參數(shù)類型C#方法的形參有四種類型:值參數(shù)、引用參數(shù)、輸出參數(shù)、參數(shù)數(shù)組。值參數(shù):未用任何修飾符聲明的形參為值參數(shù)。值形參在調(diào)用該函數(shù)〔方法、構(gòu)造函數(shù)、訪問器、運(yùn)算符〕時創(chuàng)立,并將實(shí)參值傳遞給值形參,當(dāng)該函數(shù)執(zhí)行結(jié)束時值形參被銷毀。對值形參值的修改不會影響實(shí)參值。2.3.2方法的參數(shù)類型引用參數(shù):用ref修飾符聲明的形參為引用參數(shù)。在調(diào)用函數(shù)時傳遞給引用形參的是實(shí)參地址,故對引用形參的修改將直接影響實(shí)參值。在函數(shù)調(diào)用前,相應(yīng)實(shí)參必須有值。輸出參數(shù):用out修飾符聲明的形參為輸出參數(shù)。假設(shè)函數(shù)返回多個值,可使用輸出形參。輸出形參與引用形參類似,傳遞給其的是實(shí)參地址。與引用參數(shù)不同:在函數(shù)調(diào)用前,相應(yīng)實(shí)參無需有值。2.3.2方法的參數(shù)類型參數(shù)數(shù)組:用params

修飾符聲明的形參數(shù)組為參數(shù)數(shù)組,它允許向函數(shù)傳遞個數(shù)變化的參數(shù)。在函數(shù)的形參列表中只允許出現(xiàn)一個參數(shù)數(shù)組,且在函數(shù)具有多個形參時,參數(shù)數(shù)組必須放在整個參數(shù)列表的最后。參數(shù)數(shù)組只能是一維數(shù)組,且params修飾符不能與ref、out修飾符組合使用?!纠?-4】四種參數(shù)類型。2.3.3靜態(tài)方法與實(shí)例方法使用static聲明的方法是靜態(tài)方法,反之為實(shí)例方法。靜態(tài)方法屬于類所有,通過類名訪問,靜態(tài)方法只能訪問類的靜態(tài)成員。實(shí)例方法屬于該類創(chuàng)立的某個實(shí)例所有,通過對象名訪問,實(shí)例方法可以訪問類的任何成員?!纠?-5】靜態(tài)方法與實(shí)例方法。2.3.4方法重載類中兩個以上的方法名字相同,但使用的參數(shù)類型或參數(shù)個數(shù)不同,稱為方法重載〔overload〕。編譯器會依據(jù)具體情況調(diào)用不同的方法。重載是面向?qū)ο蠹夹g(shù)中多態(tài)性的一種表達(dá)?!纠?-6】方法重載。方法重載也可以用于派生類對基類方法的重載?!纠恳娤马?。方法重寫〔override〕是多態(tài)性的另一種表達(dá),也稱為覆蓋。方法重寫主要指基類的虛方法、非虛方法在派生類中被重寫。2.3.4方法重載classMyBaseClass{

publicintMyFun(inti,intj){returni+j;}}classMyDerivedClass:MyBaseClass{

publicstringMyFun(stringstr1,stringstr2){returnstr1+str2;}}classProgram{

staticvoidMain(){

MyDerivedClassa

=

newMyDerivedClass();Console.WriteLine("派生類的函數(shù)值={0}\n",a.MyFun(100,200));

Console.WriteLine("基類的函數(shù)值={0}\n",a.MyFun("aaa","bbb"));}}2.3.5運(yùn)算符重載運(yùn)算符重載〔operatoroverloading〕是用戶對運(yùn)算符賦予新的含義。一般格式如下:publicstatic返回值類型operator運(yùn)算符(運(yùn)算對象列表){重載實(shí)現(xiàn)局部;}【例2-7】復(fù)數(shù)運(yùn)算。重載的運(yùn)算符始終是靜態(tài)的,原因:WhyareoverloadedoperatorsalwaysstaticinC#?2.3.6this運(yùn)算符this

關(guān)鍵字代表類的當(dāng)前對象,成員通過this關(guān)鍵字可以知道自己屬于類的哪一個實(shí)例。this關(guān)鍵字是隱含的,它隱含于類的成員函數(shù)中。注意:靜態(tài)函數(shù)沒有this關(guān)鍵字。this關(guān)鍵字用于從構(gòu)造函數(shù)、實(shí)例方法、實(shí)例訪問器中訪問成員?!纠縞lassEmployee{stringname,alias;publicEmployee(stringname,stringalias){=name;this.alias=alias;}}2.4域、屬性和索引器域即類字段〔field〕,是類的成員變量。聲明格式:[域修飾符]類型域名;【例】classMyClass{publicinta;}域修飾符包public、protected、internal、private、static、readonly等。readonly說明該域?yàn)橹蛔x域,只能在域定義時賦初值及構(gòu)造函數(shù)中進(jìn)行賦值,其他情況是只讀。2.4域、屬性和索引器域假設(shè)類字段沒有賦初值,其值為默認(rèn)值〔int為0,float為0.0,bool為false,string為null,對象為null〕。classAge{

readonly

int_year;Age(intyear){_year=year;}

voidChangeYear(){

//_year=1967;//Compileerrorifuncommented.

}}

2.4域、屬性和索引器屬性與域相比,屬性具有良好的封裝性。屬性不允許直接操作數(shù)據(jù)內(nèi)容,而是通過訪問器進(jìn)行訪問,可以對其值進(jìn)行保護(hù)。定義格式:訪問修飾符類型屬性名{get{…}//get語句用于返回屬性值〔即讀〕set{…}//set語句用于給屬性賦值〔即寫〕}get語句、set語句稱為訪問器〔accessor〕。2.4域、屬性和索引器屬性value關(guān)鍵字代表屬性接受的值。privateintmyInt;publicintMyIntProp{get{returnmyInt*myInt;}set{myInt=value;}}classWindow{privatedoublem_width=30;publicdoubleWidth{get{returnm_width;}set{m_width=value;}}publicstaticvoidMain(){Windoww=newWindow();w.Width=20;Console.WriteLine(“Thewidthofwindowis{0}.〞,w.Width);}}2.4域、屬性和索引器屬性只有g(shù)et語句表示該屬性為只讀屬性,只有set語句表示該屬性為只寫屬性,既有g(shù)et又有set語句表示該屬性為可讀寫屬性。屬性可以與一些操作關(guān)聯(lián),從而對數(shù)據(jù)進(jìn)行保護(hù)【例】set{if(value>=0&&value<=10)myInt=value;}2.4域、屬性和索引器索引器索引器允許類或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。索引器類似于屬性,不同的是索引器包含參數(shù)。定義索引的方式和屬性類似:包含訪問器使用this關(guān)鍵字定義一個索引值【例2-8】訪問私有數(shù)組的索引器。2.5繼承與多態(tài)繼承派生類System.Object根類多態(tài)性方法重載〔overload〕:類內(nèi)方法的重載,派生類對基類方法的重載。方法重寫〔override〕:指派生類對基類方法的重寫,包括:非虛方法的重寫〔不使用override關(guān)鍵字〕,虛方法的重寫〔使用override關(guān)鍵字〕。密閉類2.5.1繼承繼承在現(xiàn)有類的根底上創(chuàng)立新類,新類不僅繼承現(xiàn)有類的成員,而且可以重新定義或參加新的成員,從而形成類的層次或等級結(jié)構(gòu)。一般稱被繼承的類為基類或父類,而繼承后產(chǎn)生的類為派生類或子類。類修飾符class派生類類名:基類類名{類體;}2.5.1繼承C#類只支持單繼承,即只能有一個父類。Object是所有類的基類。派生類可以直接使用基類的成員,可以有自己的新成員,也可以對基類的成員函數(shù)進(jìn)行重寫〔函數(shù)名、形參類型和個數(shù)均相同〕或重載〔函數(shù)名相同,但參數(shù)類型和個數(shù)不相同〕。派生類構(gòu)造函數(shù)執(zhí)行順序:自頂向下。派生類析構(gòu)函數(shù)執(zhí)行順序:自底向上??梢灾苯訌呐缮愞D(zhuǎn)換為基類〔隱式轉(zhuǎn)換〕,不能從基類轉(zhuǎn)換為派生類〔強(qiáng)制轉(zhuǎn)換將出現(xiàn)異常〕。【例2-10】2.5.1繼承publicclassPerson{

publicintage;privatestringname=

"c#";

publicstringName{get

{returnname;}set

{name=value;}}publicvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}publicclass

Chinese:Person{}publicclass

Korean:Person{}class

Program{

staticvoidMain(){

Chinesep1=newChinese();p1.Name="Zhang";p1.SayHello();}}2.5.1繼承publicclassPerson{

publicintage;

protectedstringname=

"c#";

publicstringName{get

{returnname;}set

{name=value;}}publicvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}publicclass

Chinese:Person{

publicvoidSayHello(){Console.WriteLine("你好,{0}",name);}}publicclass

Korean:Person{

publicvoidSayHello(){Console.WriteLine("{0},思密達(dá)",name);}}class

Program{

staticvoidMain(){Chinesep1=newChinese();p1.Name="Zhang";p1.SayHello();

Koreanp2=newKorean();p2.Name="Jinchonri";p2.SayHello();}}2.5.1繼承publicclassPerson{

publicintage;

protectedstringname=

"c#";

publicstringName{get

{returnname;}set

{name=value;}}publicvoidSayHello(){

Console.WriteLine("Hello,{0}",name);}

publicvoidTellAge(){

Console.WriteLine("{0}is{1}yearsold.",name,age);}}publicclass

Chinese:Person{

publicvoidSayHello(){Console.WriteLine("你好,{0}",name);}}publicclass

Korean:Person{

publicvoidSayHello(){Console.WriteLine("{0},思密達(dá)",name);}}class

Program{

staticvoidMain(){Chinesep1=newChinese();p1.Name="Zhang";Koreanp2=newKorean();p2.Name="Jinchonri";

Personp;p=p1;p.SayHello();//問題?p=p2;p.SayHello();}}2.5.2多態(tài)性重載〔overload〕同一類中方法的重載派生類對基類方法的重載重寫〔override〕派生類對基類非虛方法的重寫?!纠?-9、2-10】對非虛方法的重寫存在的問題:通過基類對象對不同類型派生類對象進(jìn)行訪問時,將調(diào)用基類的方法,不會調(diào)用派生類重寫的方法。2.5.2多態(tài)性重載〔overload〕同一類中方法的重載派生類對基類方法的重載重寫〔override〕派生類對基類非虛方法的重寫。派生類對基類虛方法〔采用virtual關(guān)鍵字〕的重寫,重寫采用override關(guān)鍵字?!纠?-10】基類采用虛方法時,派生類重寫時使用override關(guān)鍵字。建議:需要重寫時,基類采用虛方法形式。2.5.2多態(tài)性當(dāng)涉及多態(tài)性時,可使用繼承的根類Object的方法GetType()識別不同的類型。Person[]a=new

Person[3];a[0]=newPerson();a[1]=new

Chinese();a[2]=newKorean();for(inti=0;i<a.Length;i++){

if(a[i].GetType()==typeof(Person))Console.WriteLine("Thisisaperson");

if(a[i].GetType()==typeof(Chinese))Console.WriteLine("ThisisaChinese");

if(a[i].GetType()==typeof(Korean))Console.WriteLine("ThisisaKorean");}2.5.3密封類不能被繼承的類稱為密封類,密封類的聲明需在類名前加sealed關(guān)鍵字。靜態(tài)類屬于密封類。2.6抽象類與接口抽象類抽象類的定義派生類對抽象基類的重寫接口接口的定義派生類對接口的實(shí)現(xiàn)虛方法、抽象類、接口的比較2.6.1抽象類當(dāng)創(chuàng)立類時,有時需要讓該類包含一些特殊的方法〔空方法〕,這些空方法稱為抽象方法,包含抽象方法的類稱為抽象類。抽象類的派生類必須實(shí)現(xiàn)〔即重寫〕這些方法。抽象類既可以包含抽象方法,也可以包含非抽象成員。抽象類是用來作基類的,故不能直接被實(shí)例化,也不能被密封。抽象類、抽象方法聲明須使用abstract關(guān)鍵字。2.6.1抽象類抽象方法聲明格式:[方法修飾符]abstract返回值類型方法名([參數(shù)列表]);注:抽象方法沒有方法體及{、}局部。抽象類聲明格式:[類修飾符]abstract類名{//包含抽象方法,也可以包含非抽象成員}2.6.1抽象類【例】publicabstractclassAnimal{

protecteddoubleWeight;

publicabstractvoidEat();//抽象方法}當(dāng)派生類繼承自抽象類時,派生類必須override其中的抽象方法。publicclassCat:Animal{

publicoverridevoidEat(){

Console.WriteLine("Eatfish");

}}2.6.1抽象類繼承抽象類的派生類,必須override抽象父類中每一個抽象方法,否那么該派生類仍然是抽象類而不能實(shí)例化?;愔械某橄蠓椒▽Σ煌呐缮悂碚f,提供了一種具有相同方法協(xié)議〔方法名、參數(shù)類型及個數(shù)相同〕,但各派生類可以有各自不同實(shí)現(xiàn)代碼的途徑?;惖某橄蠓椒◤?qiáng)制要求所有派生類必須override這個方法〔因?yàn)樵诨愔?,該方法是空方法〕;基類的虛方法對于派生類來說,既可以重寫〔加override〕,也可以不重寫〔因?yàn)樵诨愔?,該方法有方法體〕。2.6.1抽象類【2-11】抽象類。虛方法、抽象方法使用場合:當(dāng)各派生類有公共局部時,可定義為基類的虛方法。如:上例中Chinese、Korean派生類在執(zhí)行SayHello()方法時,先輸出英文,再輸出各自語言。當(dāng)各派生類沒有公共局部時,可定義為基類的抽象方法。如:上例中Chi

溫馨提示

  • 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

提交評論