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

下載本文檔

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

文檔簡介

C#程序設(shè)計(jì)實(shí)踐教程

C#ProgrammingPractice韓玉民余雨萍主編“物以類聚,人以群分?!?/p>

——《戰(zhàn)國策》

萬事萬物皆對象(Everythingisanobject)。

——BruceEckel《Java編程思想》面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)第8章面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)第8章8.1類與對象8.2方法8.3字段8.4屬性8.5索引器8.6面向?qū)ο筇匦?.1類與對象類(class)是最基礎(chǔ)的C#類型。類是一個(gè)數(shù)據(jù)結(jié)構(gòu),將狀態(tài)(字段)和操作(方法和其他函數(shù)成員)組合在一個(gè)單元中。類為動態(tài)創(chuàng)建的類實(shí)例(instance)提供了定義,實(shí)例也稱為對象(object)。8.1類與對象類(class)是最基礎(chǔ)的C#類型。類是一個(gè)數(shù)據(jù)結(jié)構(gòu),將狀態(tài)(字段)和操作(方法和其他函數(shù)成員)組合在一個(gè)單元中。類為動態(tài)創(chuàng)建的類實(shí)例(instance)提供了定義,實(shí)例也稱為對象(object)。8.1.1類的聲明[訪問修飾符]class類名稱{[成員修飾符]類的成員變量或者成員函數(shù)}8.1類與對象8.1.1類的聲明【實(shí)例8-1】聲明鳥類。classBird{publicstringcolor;//顏色

privatefloatspeed;//飛行速度}8.1類與對象構(gòu)造函數(shù)和析構(gòu)函數(shù)是類中比較特殊的兩種成員函數(shù),分別用來對對象進(jìn)行初始化和回收對象資源。對象的生命周期從構(gòu)造函數(shù)開始,從析構(gòu)函數(shù)結(jié)束構(gòu)造函數(shù)的名字與類名相同,析構(gòu)函數(shù)的名字也和類名相同,不過析構(gòu)函數(shù)要在名字前加一個(gè)波浪號(~)。8.1.2構(gòu)造函數(shù)和析構(gòu)函數(shù)8.1類與對象8.1.2方法的聲明【實(shí)例8-2】帶有構(gòu)造函數(shù)和析構(gòu)函數(shù)的鳥類。8.1類與對象在C#中實(shí)例化一個(gè)對象時(shí),需要經(jīng)歷下列步驟:①聲明引用;②使用new關(guān)鍵字創(chuàng)建類的對象并對其初始化;③將引用指向類的對象。如實(shí)例8-2中代碼:Birdb1=newBird();Birdb1聲明Bird類型的b1引用;newBird()通過調(diào)用構(gòu)造函數(shù)實(shí)例化Bird對象;使用b1引用到該對象。8.1.3對象的聲明和實(shí)例化8.1類與對象8.1.3類的聲明【實(shí)例8-2】帶有構(gòu)造函數(shù)和析構(gòu)函數(shù)的鳥類。classStudent{stringstrname;publicStudent(stringname)//一個(gè)參數(shù)的構(gòu)造函數(shù)

{strname=name;Console.WriteLine("姓名:"+name+"性別:未知

年齡:未知");//輸出學(xué)生信息}publicStudent(stringname,stringsex)//兩個(gè)參數(shù)的構(gòu)造函數(shù){strname=name;Console.WriteLine("姓名:"+name+"性別:"+sex+"年齡:未知");//輸出學(xué)生信息}publicStudent(stringname,stringsex,intage)//三個(gè)參數(shù)的構(gòu)造函數(shù){strname=name;Console.WriteLine("姓名:"+name+"性別:"+sex+"年齡:"+age);//輸出學(xué)生信息}~Student(){Console.WriteLine("學(xué)生"+strname+"信息輸出完畢!");//輸出操作狀態(tài)提示信息}staticvoidMain(string[]args){Console.WriteLine("輸出學(xué)生信息:");Studentstu1=newStudent("小張");//實(shí)例化類的實(shí)例Studentstu2=newStudent("小王","男");//實(shí)例化類的實(shí)例Studentstu3=newStudent("小馮","男",22);//實(shí)例化類的實(shí)例}}8.2方法一個(gè)方法是把一些相關(guān)的語句組織在一起,用來執(zhí)行一個(gè)任務(wù)的語句塊,是類的成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)是類的特殊的方法。聲明方法的格式如下:[修飾符][返回值類型]方法名稱([參數(shù)列表]){[方法體]}8.2.1方法的聲明8.2方法8.2.1方法的聲明【實(shí)例8-4】貓的喜好和本領(lǐng)classCat{publicCat(stringname)//構(gòu)造函數(shù)輸出貓的姓名

{Console.WriteLine("我是"+name);}publicvoidinterest()//輸出貓的喜好的方法

{Console.WriteLine("我喜歡曬太陽");}publicvoidaction()//輸出貓的本領(lǐng)

{Console.WriteLine("我可以捉老鼠");}staticvoidMain(string[]args){Catbigcat=newCat("小花貓");//實(shí)例化一個(gè)貓類

erest();//輸出貓的喜好

Catsmallcat=newCat("大花貓");//實(shí)例化一個(gè)貓類

smallcat.action();//輸出貓的本領(lǐng)

}}圖8-3實(shí)例方法8.2類與對象它們之間的區(qū)別有以下幾點(diǎn):(1)方法前是否有static關(guān)鍵字。(2)靜態(tài)方法是類中的一個(gè)成員方法,屬于整個(gè)類,即不用創(chuàng)建任何對象也可以直接調(diào)用,而非靜態(tài)方法則只能通過類的實(shí)例才能調(diào)用。(3)非靜態(tài)方法可以訪問類中的任何成員,靜態(tài)方法只能訪問類中的靜態(tài)成員。(4)靜態(tài)方法中不能使用this關(guān)鍵字。8.2.2靜態(tài)方法和非靜態(tài)方法8.2方法8.2.2靜態(tài)方法和非靜態(tài)方法【實(shí)例8-5】使用靜態(tài)方法和非靜態(tài)方法實(shí)現(xiàn)加法運(yùn)算classProgram{publicstaticintAdd1(intx,inty)//定義一個(gè)靜態(tài)方法實(shí)現(xiàn)整形數(shù)相加

{returnx+y;}publicintAdd2(intx,inty)//定義一個(gè)非靜態(tài)方法實(shí)現(xiàn)整形數(shù)相加

{returnx+y;}staticvoidMain(string[]args){//通過靜態(tài)方法輸出兩個(gè)數(shù)相加的結(jié)果

Console.WriteLine("靜態(tài)方法:{0}+{1}={2}",23,34,Add1(23,34));Programn=newProgram();//實(shí)例化類的對象

//通過實(shí)例方法輸出兩個(gè)數(shù)相加的結(jié)果

Console.WriteLine("實(shí)例方法:{0}+{1}={2}",23,34,n.Add2(23,34));}}圖8-4靜態(tài)方法與實(shí)例方法8.2類與對象在同一個(gè)類中定義多個(gè)方法名相同、參數(shù)列表(參數(shù)類型,參數(shù)個(gè)數(shù))不同的方法,這樣的形式稱為方法重載。重載的好處就是不用因?yàn)閰?shù)的個(gè)數(shù)和類型不同而去定義不同的函數(shù)名。調(diào)用時(shí)編譯器會根據(jù)實(shí)際傳入?yún)?shù)的形式,選擇與其匹配的方法執(zhí)行。8.2.3方法的重載8.2方法8.2.3方法的重載【實(shí)例8-6】重載實(shí)現(xiàn)整形數(shù)相加和字符串連接classProgram{publicintAdd(intx,inty) //定義一個(gè)非靜態(tài)方法實(shí)現(xiàn)整形數(shù)相加

{returnx+y;}publicstringAdd(stringa,stringb)//定義一個(gè)非靜態(tài)方法實(shí)現(xiàn)字符串連接

{returna+b;}staticvoidMain(string[]args){//實(shí)例化類的對象

Programn=newProgram(); Programstr=newProgram();//輸出兩個(gè)數(shù)相加的結(jié)果

Console.WriteLine("{0}+{1}={2}",23,34,n.Add(23,34));//輸出兩個(gè)字符串的連接結(jié)果

Console.WriteLine("{0}+{1}={2}","wel","come",str.Add("wel","come"));}}圖8-5重載方法8.3字段類中定義的變量和常量叫字段。按照不同的劃分方式可分為:靜態(tài)字段、實(shí)例字段、常量字段和只讀字段。8.3字段【實(shí)例8-7】字段的使用classProgram{stringsentence;//定義字段publicProgram(stringstrsentence)//定義構(gòu)造函數(shù){sentence=strsentence;//為字段賦初值Console.WriteLine(sentence);//輸出字段}}voidMain(string[]args){//實(shí)例化類的實(shí)例Programenglish=newProgram("英國人說:“我是英國人!”");Programchinese=newProgram("中國人說:“我是中國人!”");}}圖8-6字段的使用8.4屬性屬性與字段的區(qū)別有以下幾點(diǎn):(1)屬性是邏輯字段,是字段的擴(kuò)展,并不占用實(shí)際的內(nèi)存;而字段占用內(nèi)存空間。(2)屬性可以被其它類訪問;而非public的字段不能被直接訪問。(3)屬性可以對接受的數(shù)據(jù)在范圍上做限定;而字段不能。8.4屬性【實(shí)例8-8】屬性的使用classPeople{privatestringname;//定義name字段

publicstringName{get;set;}//定義Name自動屬性

privateintage; //定義age字段

publicintAge //定義Age屬性

{get //設(shè)置get訪問器

{returnage;}set //設(shè)置get訪問器

{if(value>0&&value<130)

{age=value;}else{Console.WriteLine("輸入數(shù)據(jù)不合理!");

}}}圖8-7屬性的使用staticvoidMain(string[]args){Peoplep=newPeople();Console.WriteLine("請輸入姓名:");p.Name=Console.ReadLine();Console.WriteLine("請輸入年齡:");p.Age=Convert.ToInt16(Console.ReadLine());}}8.5索引器索引器非常類似于屬性,也使用get和set方法,但索引器可以有參數(shù)列表,且只能作用在實(shí)例對象上,而不能在類上直接作用。定義了索引器的類可以像訪問數(shù)組一樣的使用[]運(yùn)算符訪問類的成員。8.5索引器【實(shí)例8-9】索引器的使用classPeople{privatestringname;//定義name字段

privatestringpassword;//定義password字段//定義索引器,name字段的索引值為0,password字段的索引值為1publicstringthis[intindex]{get{if(index==0)returnname;elseif(index==1)returnpassword;elsereturnnull;}set{if(index==0)name=value;elseif(index==1)password=value;}}}圖8-8索引器的使用staticvoidMain(string[]args){Peoplep=newPeople();Console.WriteLine("請輸入姓名:");p[0]=Console.ReadLine();Console.WriteLine("請輸入密碼:");p[1]=Console.ReadLine();}8.6類的面向?qū)ο筇匦苑庋b就是把客觀事物封裝成抽象的類,并且可以把數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進(jìn)行信息隱藏。在一個(gè)對象內(nèi)部,某些方法或某些數(shù)據(jù)可以是私有的,不能被外界訪問。通過這種方式,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護(hù),以防止程序中無關(guān)的部分意外的改變或錯(cuò)誤的使用了對象的私有部分。8.6.1類的封裝8.6類的面向?qū)ο筇匦浴緦?shí)例8-10】封裝Computer類classComputer//類的聲明{privateboolisRunnnig;//標(biāo)記運(yùn)行狀態(tài)publicboolIsRunning{get;set;}publicvoidOpen(){isRunnnig=true;}publicvoidClose(){isRunnnig=false;}}classProgram//類的使用{staticvoidMain(string[]args){Computercomputer=newComputer();//實(shí)例化類Computer的實(shí)例computer.Open();//對電腦的啟動進(jìn)行控制if(computer.IsRunning){Console.WriteLine("電腦已啟動!");}}}8.6.1類的封裝圖8-9封裝的使用8.6類的面向?qū)ο筇匦栽诿嫦驅(qū)ο缶幊讨校焕^承的類稱為父類或基類,繼承的類稱為子類或派生類。C#中提供了類的繼承機(jī)制,但只支持單繼承,而不支持多繼承,即一個(gè)派生類只能有一個(gè)基類。繼承的語法格式是:[修飾符]class類名:父類名{ [類體]}8.6.2類的繼承8.6類的面向?qū)ο筇匦浴緦?shí)例8-11】定義Student類繼承Person類publicclassPerson//基類{stringname;intage;publicstringName{get{returnname;}set{name=value;}}publicintAge{get{returnage;}set{age=value;}}publicvoidShow(){Console.WriteLine("我是"+name+",別害怕");}}publicclassStudent:Person//派生類{publicvoidSayHello(){Console.WriteLine("我是學(xué)生"+base.Name+",別害怕");}}8.6.2類的繼承8.6類的面向?qū)ο筇匦浴緦?shí)例8-11】定義Student類繼承Person類8.6.2類的繼承classProgram//測試類{publicstaticvoidMain(String[]args){Personp=newPerson();p.Name="張三";p.Age=38;p.Show();Students=newStudent();s.Name="李四";s.Age=16;s.Show();//調(diào)用繼承的方法

s.SayHello();}}圖8-10繼承的使用8.6類的面向?qū)ο筇匦远鄳B(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。C#提供了兩種技術(shù)來實(shí)現(xiàn)靜態(tài)多態(tài)性,分別為:函數(shù)重載和運(yùn)算符重載。動態(tài)多態(tài)性是通過虛方法、抽象類、接口來實(shí)現(xiàn)的。在父類中使用virtual關(guān)鍵字修飾的方法就是虛方法,在子類中可以使用override關(guān)鍵字對該虛方法進(jìn)行重寫。8.6.3類的多態(tài)8.6類的面向?qū)ο筇匦浴緦?shí)例8-12】具有多態(tài)性的交通工具類classVehicle{stringname;//定義字段

publicstringName//定義屬性為字段賦值

{get{returnname;}set{name=value;}}publicvirtualvoidMove()//定義方法輸出交通工具的形態(tài)

{Console.WriteLine("{0}都可以移動",this.Name);}}clas

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論