




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C#面向?qū)ο蟪绦蛟O(shè)計(jì)
工程教程計(jì)算機(jī)“十二五〞規(guī)劃教材工程七C#面向?qū)ο蟪绦蛟O(shè)計(jì)
工程教程計(jì)算機(jī)“十二五〞規(guī)劃教材工程七C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程工程七抽象類與接口——?jiǎng)?chuàng)造類的樣板學(xué)習(xí)任務(wù)理解抽象類和抽象方法。理解虛方法與抽象方法的區(qū)別。理解接口的概念并熟練使用接口。
理解接口和抽象類的區(qū)別。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程工程七抽象類與接口——?jiǎng)?chuàng)造2C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)安排任務(wù)一學(xué)習(xí)抽象類和抽象方法任務(wù)二學(xué)習(xí)接口的使用工程拓展值類型與引用類型轉(zhuǎn)換——裝箱與拆箱工程七抽象類與接口——?jiǎng)?chuàng)造類的樣板C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)安排工程七抽象類與接口3C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)一學(xué)習(xí)抽象類和抽象方法任務(wù)說明預(yù)備知識(shí)下面我們來學(xué)習(xí)抽象類和抽象方法的使用。一、抽象類抽象類是一種只實(shí)現(xiàn)局部?jī)?nèi)容的類,它主要的功能在于提供未來特定類所需的共同樣板。抽象類使用關(guān)鍵字abstract修飾,定義抽象類的語法格式如下:abstractclass<類名>{<類中成員的聲明>}抽象類不能實(shí)例化C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)一學(xué)習(xí)抽象類和抽象方法任4C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程二、抽象方法定義抽象方法使用abstract修飾符,只能在抽象類中聲明抽象方法,而且方法中不能包含任何可執(zhí)行代碼,只需要給出方法的原型即可。定義抽象方法的語法格式如下:abstractclass<類名>{[訪問修飾符]abstract返回類型方法名();}注意:抽象方法聲明只是以一個(gè)分號(hào)結(jié)束,后面沒有大括號(hào)。且聲明方法時(shí),不能使用virtual、static和private修飾符。除非派生類依然是個(gè)抽象類,否那么抽象類的派生類必須提供抽象方法的實(shí)現(xiàn)代碼。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程二、抽象方法定義抽象方5C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程在使用抽象方法和抽象類過程中,這里有以下幾點(diǎn)需要注意:〔1〕抽象類允許包含抽象成員,但是這不是必須的,抽象類還可以包含非抽象成員。因此,包含抽象方法的類一定是抽象類,但抽象類中的方法不一定是抽象方法?!?〕抽象類不能實(shí)例化,但可以引用子類對(duì)象。〔3〕抽象方法在非抽象的派生類中必須被實(shí)現(xiàn),且不能更改其修飾符?!?〕抽象類不能同時(shí)為密封類。下面我們通過一個(gè)例子來了解抽象類的這些特性。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程在使用抽象方法和抽象類過程中,這6C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程namespaceCatAndDog{abstractclassAnimal //聲明Animal〔動(dòng)物〕抽象基類{publicabstractvoidShout(); //抽象方法publicvoidWalk() //非抽象方法{Console.WriteLine("動(dòng)物走路!");}}classCat:Animal //聲明Cat〔貓〕派生類{publicoverridevoidShout() //實(shí)現(xiàn)基類中的抽象方法{Console.WriteLine("我是小貓喵喵叫!");}}程序運(yùn)行結(jié)果為:我是小貓喵喵叫!動(dòng)物走路!我是小狗汪汪叫!動(dòng)物走路!C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程namespaceCatAnd7C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程classDog:Animal //聲明Dog〔狗〕派生類{publicoverridevoidShout() //實(shí)現(xiàn)基類中的抽象方法{Console.WriteLine("我是小狗汪汪叫!");}}classProgram{staticvoidMain(string[]args){Animalanimal;animal=newCat(); //抽象類引用子類對(duì)象animal.Shout();animal.Walk();animal=newDog();animal.Shout();animal.Walk();}}}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程classDog:Anim8C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程虛方法和抽象類實(shí)現(xiàn)多態(tài)性的方式有所不同,如下表所示。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程虛方法和抽象類實(shí)現(xiàn)多態(tài)性的方式有9C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)實(shí)施——抽象類應(yīng)用案例任務(wù)說明任務(wù)實(shí)施在工程六中,我們?cè)ㄟ^一個(gè)貓狗繼承的案例來學(xué)習(xí)繼承的相關(guān)知識(shí),這里我們將案例進(jìn)行改寫,參加了抽象類。步驟1 新建一個(gè)Windows窗體應(yīng)用程序,將其命名為CatAndDog。右擊“解決方案資源管理器〞的工程名稱“CatAndDog〞,在彈出的快捷菜單中選擇“添加〞→“類〞命令,將添加的類命名為“〞,代碼編寫如下:C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)實(shí)施——抽象類應(yīng)用案例任務(wù)說10C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicabstractclassAnimal //創(chuàng)立Animal類{publicAnimal(){}//構(gòu)造函數(shù)的聲明publicAnimal(stringnick,intage,stringspecies){this.Nick=nick;this.Age=age;this.Species=species;}//私有字段privateintage; //年齡privatestringnick; //昵稱privatestringspecies; //品種//公有屬性publicintAge{get{returnage;}set{if(value>0&&value<100)age=value;elseage=1;}}publicstringNick{get{returnnick;}set{nick=value;}}publicstringSpecies{get{returnspecies;}set{species=value;}}}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicabstract11C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicclassCat:Animal{publicCat(){} //構(gòu)造函數(shù)的聲明publicCat(stringnick,intage,stringspecies,stringhobby){//繼承自父類的屬性this.Nick=nick;this.Age=age;this.Species=species;this.Hobby=hobby;} //貓類擴(kuò)展的屬性privatestringhobby; //愛好的字段和屬性的聲明publicstringHobby{get{returnhobby;}set{hobby=value;}}publicstringShout() //貓類的方法{strings;s=string.Format(“大家好,我是小貓{0},今年{1}歲了,我屬于{2},喜歡{3}!",this.Nick,this.Age,this.Species,this.hobby);returns;}}步驟2參照步驟1中的方法添加cat類,命名為“〞,代碼編寫如下:C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicclassCat12C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟3 添加dog類,命名為“〞,代碼編寫如下:publicclassDog:Animal{publicDog(){}//構(gòu)造函數(shù)的聲明publicDog(stringnick,intage,stringspecies,intpopularity):base(nick,age,species){//繼承自父類的屬性this.Nick=nick;this.Age=age;this.Species=species;this.Popularity=popularity;}//狗類擴(kuò)展的屬性privateintpopularity;//人氣指數(shù)的字段和屬性的聲明publicintPopularity{get{returnpopularity;}set{popularity=value;}}publicstringShout()//狗類的方法{strings;s=string.Format("大家好,我是小狗{0},今年{1}歲了,我屬于{2},我的人氣指數(shù)是{3}!",this.Nick,this.Age,this.Species,this.Popularity);returns;}}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟3 添加dog類,命名為13C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟4 將現(xiàn)有的窗體,更名為“〞,并在窗體中添加兩個(gè)按鈕,如右圖所示。步驟5 分別雙擊窗體中的兩個(gè)按鈕,編寫按鈕的單擊事件處理程序,代碼如下:privatevoidbtnOK_Click(objectsender,EventArgse){
Animalanimal;
animal=newCat("豆豆",2,"波斯貓","玩毛線團(tuán)");MessageBox.Show(animal.Shout());
animal=newDog("皮皮",5,"吉娃娃",2000);MessageBox.Show(animal.Shout());}privatevoidbtnExit_Click(objectsender,EventArgse){this.Close();}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟4 將現(xiàn)有的窗體,更名為14C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟6 按【F5】鍵調(diào)試程序,運(yùn)行效果如以下圖所示。步驟7 右擊“解決方案資源管理器〞的工程名稱,在彈出的快捷菜單中選擇“查看類關(guān)系圖〞命令,在系統(tǒng)自動(dòng)翻開的選項(xiàng)頁中可以看到如左圖所示的類之間的繼承關(guān)系圖。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟6 按【F5】鍵調(diào)試程序15C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)二
學(xué)習(xí)接口的使用電腦上的USB接口可以用來插鼠標(biāo)、優(yōu)盤、攝像頭等,所有需要插在USB接口的設(shè)備都必須符合USB標(biāo)準(zhǔn)。與此類似,C#中的接口定義了一種標(biāo)準(zhǔn),實(shí)現(xiàn)接口的類應(yīng)遵循該標(biāo)準(zhǔn)。下面我們就來學(xué)習(xí)與接口相關(guān)的知識(shí)。任務(wù)說明預(yù)備知識(shí)一、接口的聲明接口是一種引用數(shù)據(jù)類型,使用interface關(guān)鍵字聲明,聲明接口的語法格式如下:屬性
接口修飾符interface接口名:基接口{//接口的成員}關(guān)鍵字interface、接口名和接口體是必須的,其它項(xiàng)是可選的。接口修飾符可以是new、public、protected、internal和private。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)二學(xué)習(xí)接口的使用16C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程接口的聲明需要注意以下幾點(diǎn):〔1〕接口聲明中只包括方法的定義,沒有實(shí)現(xiàn)代碼。即只需給出返回類型、方法名稱和參數(shù)列表,然后以分號(hào)結(jié)束。這意味著不能實(shí)例化一個(gè)接口,只能實(shí)例化由該接口派生的類對(duì)象?!?〕接口成員只能包含方法、屬性、事件和索引器,不能包含常量、數(shù)據(jù)字段、靜態(tài)成員、構(gòu)造函數(shù)和析構(gòu)函數(shù)?!?〕一個(gè)接口的所有成員都是隱式公有的,如果試圖在接口成員中指定任何其他修飾符,編譯器將給出一個(gè)錯(cuò)誤提示。〔4〕為增加程序的可讀性,接口的名稱通常以“I〞開頭。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程接口的聲明需要注意以下幾點(diǎn):〔117C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程以下代碼聲明了一個(gè)名為IPict的接口,接口中包含兩個(gè)方法的聲明。publicinterfaceIPict{intDeleteImage();voidDisplayImage();}二、接口的繼承與類的繼承性稍有不同,接口繼承其特點(diǎn)如下:〔1〕與類繼承不同,派生接口繼承了基接口中的函數(shù)成員說明,而沒有繼承父接口的實(shí)現(xiàn)。〔2〕與類繼承的單繼承不同,接口繼承允許多繼承,一個(gè)派生接口可以有多個(gè)基接口。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程以下代碼聲明了一個(gè)名為IPict18C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程下面我們來看一個(gè)C#接口繼承的例子:interfaceIControl{ voidPaint();}interfaceITextBox:Icontrol //繼承了接口Icontrol的方法Paint(){ voidSetText(stringtext);}interfaceIListBox:Icontrol //繼承了接口Icontrol的方法Paint(){ voidSetItems(string[]items);}interfaceIComboBox:ITextBox,IListBox{//可以聲明新方法}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程下面我們來看一個(gè)C#接口繼承的例19C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程三、接口的實(shí)現(xiàn)接口聲明只包括成員的定義,而沒有實(shí)現(xiàn)代碼。接口中的成員都必須在其派生類中實(shí)現(xiàn)。〔1〕接口的簡(jiǎn)單實(shí)現(xiàn)創(chuàng)立MyImages類,用以實(shí)現(xiàn)前面聲明的IPict接口。publicclassMyImages:IPict{publicintDeleteImage(){Console.WriteLine("刪除圖像!");return3;}publicvoidDisplayImage(){Console.WriteLine("顯示圖像!");}}classProgram{staticvoidMain(string[]args){MyImagesmyimages=newMyImages();myimages.DisplayImage();Console.WriteLine("刪除了"+myimages.DeleteImage()+"張圖像!");}}程序運(yùn)行結(jié)果為:顯示圖像!刪除圖像!刪除了3張圖像!C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程三、接口的實(shí)現(xiàn)接口聲明只20C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程從以上程序中可以總結(jié)出:實(shí)現(xiàn)接口和實(shí)現(xiàn)繼承相同,都是使用冒號(hào)“:〞運(yùn)算符;派生類中對(duì)接口中方法的實(shí)現(xiàn)方式與抽象類不同,沒有使用override關(guān)鍵字,并且實(shí)現(xiàn)方法時(shí),需顯式添加public訪問修飾符;在Main()方法中實(shí)例化接口類的方式及調(diào)用方法的方式與普通類相同。如果一個(gè)派生類既繼承自基類又實(shí)現(xiàn)接口,那么在聲明派生類的基類列表中,要先寫基類再寫接口,否那么會(huì)出現(xiàn)編譯錯(cuò)誤。publicclassMyImages:MyBase,IPict例如:C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程從以上程序中可以總結(jié)出:實(shí)21C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程〔2〕多重接口的實(shí)現(xiàn)C#中不支持類的多重繼承,一個(gè)類不能同時(shí)派生自多個(gè)類。但是,C#中允許多重接口實(shí)現(xiàn),這就意味著一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。namespaceMyInterface{publicclassMyBase{publicvoidOpen(){Console.WriteLine("翻開圖像文件夾:");}}publicinterfaceIPict{intDeleteImage();voidDisplayImage();}publicinterfaceIPicMod{voidModifyImage();}publicclassMyImages:MyBase,IPict,IPicMod{publicintDeleteImage(){Console.WriteLine("刪除圖像!");return3;}publicvoidDisplayImage(){Console.WriteLine("顯示圖像!");}publicvoidModifyImage(){Console.WriteLine("編輯圖像!");}}classProgram{staticvoidMain(string[]args){MyImagesmyimages=newMyImages();myimages.Open();myimages.DisplayImage();myimages.ModifyImage();Console.WriteLine("刪除了"+myimages.DeleteImage()+"張圖像!");}}}例如:程序運(yùn)行結(jié)果為:翻開圖像文件夾:顯示圖像!編輯圖像!刪除圖像!刪除了3張圖像!C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程〔2〕多重接口的實(shí)現(xiàn)C22C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程如果兩個(gè)接口中包含相同的方法〔方法名、返回類型及參數(shù)均相同〕,此時(shí)需要使用接口名稱來限定該方法以明確定在派生類中實(shí)現(xiàn)的是哪一個(gè)接口中的方法,例如:publicvoidIPict.DisplayImage(){Console.WriteLine("顯示圖像!");}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程如果兩個(gè)接口中包含相同的23C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程接口和抽象類有很多相似之處,當(dāng)然也存在不同點(diǎn),如下表所示。四、接口與抽象類的區(qū)別C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程接口和抽象類有很多相似之處,當(dāng)然24C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)實(shí)施——多變的任務(wù)說明實(shí)施步驟通過繼承、接口等相關(guān)知識(shí),創(chuàng)立一個(gè)控制臺(tái)應(yīng)用程序用于模擬的各項(xiàng)功能。步驟1 新建一個(gè)控制臺(tái)應(yīng)用程序,將其命名為MyIPhone,在文件中編寫代碼如下:namespaceMyIphone{publicinterfaceIPhone{voidgetPhoneNumber(); //來電顯示voidgetRingTone(); //顯示鈴聲}publicinterfaceIPhoneDetails{voidgetMfgModel(); //顯示型號(hào)}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)實(shí)施——多變的任務(wù)說明25C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicclassMyPhone:IPhone,IPhoneDetails{publicvoidgetPhoneNumber(){Console.WriteLine("顯示號(hào)碼。");}publicvoidgetRingTone(){Console.WriteLine("顯示來電鈴聲。");}publicvoidgetMfgModel(){Console.WriteLine("顯示制造商和型號(hào)。");}}classProgram{staticvoidMain(string[]args){MyPhoneobjP=newMyPhone();objP.getPhoneNumber();objP.getRingTone();objP.getMfgModel();}}}步驟2 按【Ctrl+F5】鍵執(zhí)行程序,結(jié)果如以下圖所示。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicclassMyP26C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程工程拓展值類型與引用類型轉(zhuǎn)換——裝箱與拆箱值類型與引用數(shù)據(jù)類型的轉(zhuǎn)換機(jī)制——裝箱〔boxing〕和拆箱〔unboxing〕〔一〕什么是裝箱轉(zhuǎn)換裝箱轉(zhuǎn)換是指將一個(gè)值類型轉(zhuǎn)換成一個(gè)對(duì)象類型〔即object類〕,或者是說,把這個(gè)值類型轉(zhuǎn)換成一個(gè)被該值類型應(yīng)用的接口類型interface-type。在這一過程中創(chuàng)立一個(gè)對(duì)象實(shí)例并且將值類型的值復(fù)制到新的對(duì)象中。裝箱操作是隱式進(jìn)行的,例如:inti=10;objectobj=i;C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程工程拓展值類型與引用類型轉(zhuǎn)換——27C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程〔二〕什么是拆箱轉(zhuǎn)換和裝箱轉(zhuǎn)換正好相反,拆箱轉(zhuǎn)換是指將一個(gè)對(duì)象類型顯式地轉(zhuǎn)換成一個(gè)值類型,或是將一個(gè)接口類型顯式地轉(zhuǎn)換成一個(gè)執(zhí)行該接口的值類型。拆箱的過程分為兩步:首先檢查這個(gè)對(duì)象實(shí)例,看它是否為給定的值類型的裝箱值;然后把這個(gè)實(shí)例的值拷貝給值類型的變量。我們來看一個(gè)將對(duì)象拆箱的過程。inti=10;objectobj=i;intj=(int)obj;C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程〔二〕什么是拆箱轉(zhuǎn)換和裝28C#面向?qū)ο蟪绦蛟O(shè)計(jì)
工程教程計(jì)算機(jī)“十二五〞規(guī)劃教材工程七C#面向?qū)ο蟪绦蛟O(shè)計(jì)
工程教程計(jì)算機(jī)“十二五〞規(guī)劃教材工程七C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程工程七抽象類與接口——?jiǎng)?chuàng)造類的樣板學(xué)習(xí)任務(wù)理解抽象類和抽象方法。理解虛方法與抽象方法的區(qū)別。理解接口的概念并熟練使用接口。
理解接口和抽象類的區(qū)別。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程工程七抽象類與接口——?jiǎng)?chuàng)造30C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)安排任務(wù)一學(xué)習(xí)抽象類和抽象方法任務(wù)二學(xué)習(xí)接口的使用工程拓展值類型與引用類型轉(zhuǎn)換——裝箱與拆箱工程七抽象類與接口——?jiǎng)?chuàng)造類的樣板C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)安排工程七抽象類與接口31C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)一學(xué)習(xí)抽象類和抽象方法任務(wù)說明預(yù)備知識(shí)下面我們來學(xué)習(xí)抽象類和抽象方法的使用。一、抽象類抽象類是一種只實(shí)現(xiàn)局部?jī)?nèi)容的類,它主要的功能在于提供未來特定類所需的共同樣板。抽象類使用關(guān)鍵字abstract修飾,定義抽象類的語法格式如下:abstractclass<類名>{<類中成員的聲明>}抽象類不能實(shí)例化C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)一學(xué)習(xí)抽象類和抽象方法任32C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程二、抽象方法定義抽象方法使用abstract修飾符,只能在抽象類中聲明抽象方法,而且方法中不能包含任何可執(zhí)行代碼,只需要給出方法的原型即可。定義抽象方法的語法格式如下:abstractclass<類名>{[訪問修飾符]abstract返回類型方法名();}注意:抽象方法聲明只是以一個(gè)分號(hào)結(jié)束,后面沒有大括號(hào)。且聲明方法時(shí),不能使用virtual、static和private修飾符。除非派生類依然是個(gè)抽象類,否那么抽象類的派生類必須提供抽象方法的實(shí)現(xiàn)代碼。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程二、抽象方法定義抽象方33C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程在使用抽象方法和抽象類過程中,這里有以下幾點(diǎn)需要注意:〔1〕抽象類允許包含抽象成員,但是這不是必須的,抽象類還可以包含非抽象成員。因此,包含抽象方法的類一定是抽象類,但抽象類中的方法不一定是抽象方法?!?〕抽象類不能實(shí)例化,但可以引用子類對(duì)象?!?〕抽象方法在非抽象的派生類中必須被實(shí)現(xiàn),且不能更改其修飾符?!?〕抽象類不能同時(shí)為密封類。下面我們通過一個(gè)例子來了解抽象類的這些特性。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程在使用抽象方法和抽象類過程中,這34C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程namespaceCatAndDog{abstractclassAnimal //聲明Animal〔動(dòng)物〕抽象基類{publicabstractvoidShout(); //抽象方法publicvoidWalk() //非抽象方法{Console.WriteLine("動(dòng)物走路!");}}classCat:Animal //聲明Cat〔貓〕派生類{publicoverridevoidShout() //實(shí)現(xiàn)基類中的抽象方法{Console.WriteLine("我是小貓喵喵叫!");}}程序運(yùn)行結(jié)果為:我是小貓喵喵叫!動(dòng)物走路!我是小狗汪汪叫!動(dòng)物走路!C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程namespaceCatAnd35C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程classDog:Animal //聲明Dog〔狗〕派生類{publicoverridevoidShout() //實(shí)現(xiàn)基類中的抽象方法{Console.WriteLine("我是小狗汪汪叫!");}}classProgram{staticvoidMain(string[]args){Animalanimal;animal=newCat(); //抽象類引用子類對(duì)象animal.Shout();animal.Walk();animal=newDog();animal.Shout();animal.Walk();}}}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程classDog:Anim36C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程虛方法和抽象類實(shí)現(xiàn)多態(tài)性的方式有所不同,如下表所示。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程虛方法和抽象類實(shí)現(xiàn)多態(tài)性的方式有37C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)實(shí)施——抽象類應(yīng)用案例任務(wù)說明任務(wù)實(shí)施在工程六中,我們?cè)ㄟ^一個(gè)貓狗繼承的案例來學(xué)習(xí)繼承的相關(guān)知識(shí),這里我們將案例進(jìn)行改寫,參加了抽象類。步驟1 新建一個(gè)Windows窗體應(yīng)用程序,將其命名為CatAndDog。右擊“解決方案資源管理器〞的工程名稱“CatAndDog〞,在彈出的快捷菜單中選擇“添加〞→“類〞命令,將添加的類命名為“〞,代碼編寫如下:C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)實(shí)施——抽象類應(yīng)用案例任務(wù)說38C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicabstractclassAnimal //創(chuàng)立Animal類{publicAnimal(){}//構(gòu)造函數(shù)的聲明publicAnimal(stringnick,intage,stringspecies){this.Nick=nick;this.Age=age;this.Species=species;}//私有字段privateintage; //年齡privatestringnick; //昵稱privatestringspecies; //品種//公有屬性publicintAge{get{returnage;}set{if(value>0&&value<100)age=value;elseage=1;}}publicstringNick{get{returnnick;}set{nick=value;}}publicstringSpecies{get{returnspecies;}set{species=value;}}}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicabstract39C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicclassCat:Animal{publicCat(){} //構(gòu)造函數(shù)的聲明publicCat(stringnick,intage,stringspecies,stringhobby){//繼承自父類的屬性this.Nick=nick;this.Age=age;this.Species=species;this.Hobby=hobby;} //貓類擴(kuò)展的屬性privatestringhobby; //愛好的字段和屬性的聲明publicstringHobby{get{returnhobby;}set{hobby=value;}}publicstringShout() //貓類的方法{strings;s=string.Format(“大家好,我是小貓{0},今年{1}歲了,我屬于{2},喜歡{3}!",this.Nick,this.Age,this.Species,this.hobby);returns;}}步驟2參照步驟1中的方法添加cat類,命名為“〞,代碼編寫如下:C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程publicclassCat40C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟3 添加dog類,命名為“〞,代碼編寫如下:publicclassDog:Animal{publicDog(){}//構(gòu)造函數(shù)的聲明publicDog(stringnick,intage,stringspecies,intpopularity):base(nick,age,species){//繼承自父類的屬性this.Nick=nick;this.Age=age;this.Species=species;this.Popularity=popularity;}//狗類擴(kuò)展的屬性privateintpopularity;//人氣指數(shù)的字段和屬性的聲明publicintPopularity{get{returnpopularity;}set{popularity=value;}}publicstringShout()//狗類的方法{strings;s=string.Format("大家好,我是小狗{0},今年{1}歲了,我屬于{2},我的人氣指數(shù)是{3}!",this.Nick,this.Age,this.Species,this.Popularity);returns;}}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟3 添加dog類,命名為41C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟4 將現(xiàn)有的窗體,更名為“〞,并在窗體中添加兩個(gè)按鈕,如右圖所示。步驟5 分別雙擊窗體中的兩個(gè)按鈕,編寫按鈕的單擊事件處理程序,代碼如下:privatevoidbtnOK_Click(objectsender,EventArgse){
Animalanimal;
animal=newCat("豆豆",2,"波斯貓","玩毛線團(tuán)");MessageBox.Show(animal.Shout());
animal=newDog("皮皮",5,"吉娃娃",2000);MessageBox.Show(animal.Shout());}privatevoidbtnExit_Click(objectsender,EventArgse){this.Close();}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟4 將現(xiàn)有的窗體,更名為42C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟6 按【F5】鍵調(diào)試程序,運(yùn)行效果如以下圖所示。步驟7 右擊“解決方案資源管理器〞的工程名稱,在彈出的快捷菜單中選擇“查看類關(guān)系圖〞命令,在系統(tǒng)自動(dòng)翻開的選項(xiàng)頁中可以看到如左圖所示的類之間的繼承關(guān)系圖。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程步驟6 按【F5】鍵調(diào)試程序43C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)二
學(xué)習(xí)接口的使用電腦上的USB接口可以用來插鼠標(biāo)、優(yōu)盤、攝像頭等,所有需要插在USB接口的設(shè)備都必須符合USB標(biāo)準(zhǔn)。與此類似,C#中的接口定義了一種標(biāo)準(zhǔn),實(shí)現(xiàn)接口的類應(yīng)遵循該標(biāo)準(zhǔn)。下面我們就來學(xué)習(xí)與接口相關(guān)的知識(shí)。任務(wù)說明預(yù)備知識(shí)一、接口的聲明接口是一種引用數(shù)據(jù)類型,使用interface關(guān)鍵字聲明,聲明接口的語法格式如下:屬性
接口修飾符interface接口名:基接口{//接口的成員}關(guān)鍵字interface、接口名和接口體是必須的,其它項(xiàng)是可選的。接口修飾符可以是new、public、protected、internal和private。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程任務(wù)二學(xué)習(xí)接口的使用44C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程接口的聲明需要注意以下幾點(diǎn):〔1〕接口聲明中只包括方法的定義,沒有實(shí)現(xiàn)代碼。即只需給出返回類型、方法名稱和參數(shù)列表,然后以分號(hào)結(jié)束。這意味著不能實(shí)例化一個(gè)接口,只能實(shí)例化由該接口派生的類對(duì)象?!?〕接口成員只能包含方法、屬性、事件和索引器,不能包含常量、數(shù)據(jù)字段、靜態(tài)成員、構(gòu)造函數(shù)和析構(gòu)函數(shù)?!?〕一個(gè)接口的所有成員都是隱式公有的,如果試圖在接口成員中指定任何其他修飾符,編譯器將給出一個(gè)錯(cuò)誤提示?!?〕為增加程序的可讀性,接口的名稱通常以“I〞開頭。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程接口的聲明需要注意以下幾點(diǎn):〔145C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程以下代碼聲明了一個(gè)名為IPict的接口,接口中包含兩個(gè)方法的聲明。publicinterfaceIPict{intDeleteImage();voidDisplayImage();}二、接口的繼承與類的繼承性稍有不同,接口繼承其特點(diǎn)如下:〔1〕與類繼承不同,派生接口繼承了基接口中的函數(shù)成員說明,而沒有繼承父接口的實(shí)現(xiàn)?!?〕與類繼承的單繼承不同,接口繼承允許多繼承,一個(gè)派生接口可以有多個(gè)基接口。C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程以下代碼聲明了一個(gè)名為IPict46C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程下面我們來看一個(gè)C#接口繼承的例子:interfaceIControl{ voidPaint();}interfaceITextBox:Icontrol //繼承了接口Icontrol的方法Paint(){ voidSetText(stringtext);}interfaceIListBox:Icontrol //繼承了接口Icontrol的方法Paint(){ voidSetItems(string[]items);}interfaceIComboBox:ITextBox,IListBox{//可以聲明新方法}C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程下面我們來看一個(gè)C#接口繼承的例47C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程三、接口的實(shí)現(xiàn)接口聲明只包括成員的定義,而沒有實(shí)現(xiàn)代碼。接口中的成員都必須在其派生類中實(shí)現(xiàn)?!?〕接口的簡(jiǎn)單實(shí)現(xiàn)創(chuàng)立MyImages類,用以實(shí)現(xiàn)前面聲明的IPict接口。publicclassMyImages:IPict{publicintDeleteImage(){Console.WriteLine("刪除圖像!");return3;}publicvoidDisplayImage(){Console.WriteLine("顯示圖像!");}}classProgram{staticvoidMain(string[]args){MyImagesmyimages=newMyImages();myimages.DisplayImage();Console.WriteLine("刪除了"+myimages.DeleteImage()+"張圖像!");}}程序運(yùn)行結(jié)果為:顯示圖像!刪除圖像!刪除了3張圖像!C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程三、接口的實(shí)現(xiàn)接口聲明只48C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程從以上程序中可以總結(jié)出:實(shí)現(xiàn)接口和實(shí)現(xiàn)繼承相同,都是使用冒號(hào)“:〞運(yùn)算符;派生類中對(duì)接口中方法的實(shí)現(xiàn)方式與抽象類不同,沒有使用override關(guān)鍵字,并且實(shí)現(xiàn)方法時(shí),需顯式添加public訪問修飾符;在Main()方法中實(shí)例化接口類的方式及調(diào)用方法的方式與普通類相同。如果一個(gè)派生類既繼承自基類又實(shí)現(xiàn)接口,那么在聲明派生類的基類列表中,要先寫基類再寫接口,否那么會(huì)出現(xiàn)編譯錯(cuò)誤。publicclassMyImages:MyBase,IPict例如:C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程從以上程序中可以總結(jié)出:實(shí)49C#面向?qū)ο蟪绦蛟O(shè)計(jì)工程教程〔2〕多重接口的實(shí)現(xiàn)C#中不支持類的多重繼承,一個(gè)類不能同時(shí)派生自多個(gè)類。但是,C#中允許多重接口實(shí)現(xiàn),這就意味著一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。namespaceMyInterface{publicclassMyBase{publicvoidOpen(){Console.WriteLine("翻開圖像文件夾:");}}publicinterfaceIPict{intDeleteImage();voidDisplayImage();}publicinterfaceIPicMod{voidModifyImage();}publicclassMyImages:MyBase,IPict,IPicMod{publicintDeleteImage(){Console.WriteLine("刪除圖像!");return3;}publicvoidDisplayImage(){Console.WriteLine("顯示圖像!");}publicvoidModifyImage(){Console.WriteLine("編輯圖像!");}}classProgram{staticvoidMain(string[]args){MyImagesmyimages=newMyImages();myimages.Open();myimages.DisplayImag
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 批發(fā)業(yè)貨架陳列技巧考核試卷
- 健康營(yíng)養(yǎng)品批發(fā)商的智慧物流技術(shù)創(chuàng)新應(yīng)用考核試卷
- 勘察項(xiàng)目項(xiàng)目管理海洋工程文化建設(shè)考核試卷
- 體育組織的歷史與演變考核試卷
- 用火安全主題班會(huì)課件
- 交通文明與安全課件
- 作品采購(gòu)合同范本模板
- 芒果直播代售合同范本
- 裝修工程供應(yīng)合同范本
- 酒店客房服務(wù)規(guī)范與操作流程優(yōu)化制度
- 火車站消防指導(dǎo)培訓(xùn)課件
- 婦產(chǎn)科全套課件
- 穴位貼敷的運(yùn)用課件
- 中心靜脈壓與有創(chuàng)動(dòng)脈血壓監(jiān)測(cè)護(hù)理
- 【銅版畫“飛塵”技法實(shí)踐研究4900字(論文)】
- 人教版道德與法治五年級(jí)下冊(cè)全冊(cè)課件(完整版)
- 《GMP實(shí)務(wù)教程》 完整全套教學(xué)課件 項(xiàng)目1-14 GMP基礎(chǔ)知識(shí)-藥品生產(chǎn)行政檢查
- 京東集團(tuán)員工手冊(cè)
- 房屋租賃交接家私清單
- 教師教學(xué)常規(guī)培訓(xùn)講座課件
- 《Hadoop大數(shù)據(jù)平臺(tái)基礎(chǔ)》復(fù)習(xí)考試題庫(帶答案)
評(píng)論
0/150
提交評(píng)論