版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、本章學(xué)習(xí)目的本章學(xué)習(xí)目的了解類的承繼與多態(tài)的概念了解類的承繼與多態(tài)的概念熟習(xí)類型轉(zhuǎn)換的方法熟習(xí)類型轉(zhuǎn)換的方法掌握構(gòu)造與接口的定義及用法掌握構(gòu)造與接口的定義及用法掌握異常處置的方法掌握異常處置的方法掌握委托的定義及用法掌握委托的定義及用法第四章第四章 面向?qū)ο缶幊踢M(jìn)階面向?qū)ο缶幊踢M(jìn)階4.1 類的承繼與多態(tài)類的承繼與多態(tài)4.3 類型轉(zhuǎn)換類型轉(zhuǎn)換4.4 構(gòu)造與接口構(gòu)造與接口4.6 異常處置異常處置4.7 委托委托4.1 類的承繼與多態(tài)類的承繼與多態(tài)4.1.1 承繼承繼4.1.2 多態(tài)多態(tài)4.1.1 承繼承繼 類的承繼性:類的承繼性:C#允許基于某一個(gè)曾經(jīng)定義的類來創(chuàng)建一允許基于某一個(gè)曾經(jīng)定義的類來創(chuàng)
2、建一個(gè)新類。個(gè)新類。 基類:被承繼的類,即父類?;悾罕怀欣^的類,即父類。 派生類:承繼的類,即子類。派生類:承繼的類,即子類。4.1.1 承繼承繼訪問修飾符訪問修飾符 class 類名類名 : 基類基類 類主體類主體 訪問修飾符:訪問修飾符:public:表示不限制對(duì)類的訪問;:表示不限制對(duì)類的訪問;internal:可被同一個(gè)工程的程序訪問;:可被同一個(gè)工程的程序訪問;sealed: 表示一個(gè)密封類,不能被承繼。表示一個(gè)密封類,不能被承繼。 闡明:假設(shè)對(duì)類不指定訪問修飾符,那么類的默許訪問修飾符為闡明:假設(shè)對(duì)類不指定訪問修飾符,那么類的默許訪問修飾符為internal 定義派生類定義派生類
3、4.1.1 承繼承繼 class Person public string name; protect string sex; int age; class Student : Person string stuNo; string classNo; 定義派生類定義派生類4.1.1 承繼承繼派生類只能承繼于一個(gè)基類;派生類只能承繼于一個(gè)基類;派生類自然承繼基類的成員,但不能承繼基類的構(gòu)造函數(shù)成員;派生類自然承繼基類的成員,但不能承繼基類的構(gòu)造函數(shù)成員;類的承繼可以傳送。如類的承繼可以傳送。如C類承繼類承繼B類,類,B類承繼類承繼A類,那么類,那么C類具類具有有B類和類和A類的成員;類的成員;派
4、生類是對(duì)基類的擴(kuò)展,派生類定義中可以聲明新的成員;派生類是對(duì)基類的擴(kuò)展,派生類定義中可以聲明新的成員;派生類定義中假設(shè)聲明了與基類同名的成員,那么基類的同名成派生類定義中假設(shè)聲明了與基類同名的成員,那么基類的同名成員將被隱藏,從而使派生類不能直接訪問同名的基類的成員;員將被隱藏,從而使派生類不能直接訪問同名的基類的成員;基類可以定義虛方法成員等,這樣派生類可以覆蓋這些成員以表基類可以定義虛方法成員等,這樣派生類可以覆蓋這些成員以表現(xiàn)類的多態(tài)性?,F(xiàn)類的多態(tài)性。類的承繼規(guī)那類的承繼規(guī)那么么4.1.1 承繼承繼派生類構(gòu)造函數(shù)派生類構(gòu)造函數(shù) 默許執(zhí)行基類的無參構(gòu)造函數(shù),假設(shè)要執(zhí)行基類有參構(gòu)默許執(zhí)行基類
5、的無參構(gòu)造函數(shù),假設(shè)要執(zhí)行基類有參構(gòu)造函數(shù),那么必需在派生類構(gòu)造函數(shù)的基表列表中指出;造函數(shù),那么必需在派生類構(gòu)造函數(shù)的基表列表中指出; 構(gòu)造函數(shù)調(diào)用順序:先基類后派生類。構(gòu)造函數(shù)調(diào)用順序:先基類后派生類。 派生類析構(gòu)函數(shù)派生類析構(gòu)函數(shù) 析構(gòu)函數(shù)調(diào)用順序:先派生類后基類。析構(gòu)函數(shù)調(diào)用順序:先派生類后基類。4.1.1 承繼承繼base 在派生類中調(diào)用基類方法在派生類中調(diào)用基類方法 在構(gòu)造函數(shù)中顯式調(diào)用基類構(gòu)造函數(shù)在構(gòu)造函數(shù)中顯式調(diào)用基類構(gòu)造函數(shù) public 派生類名派生類名(形參列表形參列表): base(基類構(gòu)造函基類構(gòu)造函數(shù)實(shí)參列表數(shù)實(shí)參列表) 在方法中調(diào)用基類方法在方法中調(diào)用基類方法 b
6、ase.基類方法名基類方法名(參數(shù)表參數(shù)表)4.1.1 承繼承繼隱藏隱藏隱藏隱藏自動(dòng)隱藏與基類同名的成員自動(dòng)隱藏與基類同名的成員聲明成員時(shí),顯式運(yùn)用聲明成員時(shí),顯式運(yùn)用new修飾符修飾符隱藏本質(zhì)上是使承繼的成員在派生類成為不可見的。隱藏隱藏本質(zhì)上是使承繼的成員在派生類成為不可見的。隱藏的成員并沒有被刪除,只是不能從派生類直接訪問,經(jīng)過基類的成員并沒有被刪除,只是不能從派生類直接訪問,經(jīng)過基類可以直接訪問它??梢灾苯釉L問它。4.1.2 多態(tài)多態(tài) 編譯時(shí)實(shí)現(xiàn)的多態(tài):編譯時(shí)實(shí)現(xiàn)的多態(tài): 假設(shè)一個(gè)類中有兩個(gè)或兩個(gè)以上的方法的名字一樣,而它假設(shè)一個(gè)類中有兩個(gè)或兩個(gè)以上的方法的名字一樣,而它們的形參個(gè)數(shù)或
7、形參類型有所不同,在程序編譯時(shí)可以正們的形參個(gè)數(shù)或形參類型有所不同,在程序編譯時(shí)可以正確區(qū)別他們;確區(qū)別他們; 運(yùn)轉(zhuǎn)時(shí)實(shí)現(xiàn)的多態(tài):運(yùn)轉(zhuǎn)時(shí)實(shí)現(xiàn)的多態(tài): 指在程序運(yùn)轉(zhuǎn)時(shí),基類對(duì)象執(zhí)行一個(gè)基類與派生類都具有指在程序運(yùn)轉(zhuǎn)時(shí),基類對(duì)象執(zhí)行一個(gè)基類與派生類都具有的同名方法調(diào)用時(shí),程序可以根據(jù)基類對(duì)象類型的不同的同名方法調(diào)用時(shí),程序可以根據(jù)基類對(duì)象類型的不同基類還是派生類進(jìn)展正確的調(diào)用?;愡€是派生類進(jìn)展正確的調(diào)用。 實(shí)現(xiàn)方法:虛方法、籠統(tǒng)方法實(shí)現(xiàn)方法:虛方法、籠統(tǒng)方法4.1.2 多態(tài)多態(tài)虛方法虛方法public virtual 前往類型前往類型 方法名參數(shù)列表方法名參數(shù)列表 方法體方法體 基類中定義虛方法
8、基類中定義虛方法public override 前往類型前往類型 方法名參數(shù)列表方法名參數(shù)列表 方法體方法體 派生類中重寫基類中定義虛方法派生類中重寫基類中定義虛方法4.1.2 多態(tài)多態(tài)虛方法虛方法幾點(diǎn)闡明:幾點(diǎn)闡明:基類與派生類中的方法名、參數(shù)列表、前往類基類與派生類中的方法名、參數(shù)列表、前往類型必需完全一致;型必需完全一致;可被重寫的基類方法是虛方法、籠統(tǒng)方法或重可被重寫的基類方法是虛方法、籠統(tǒng)方法或重寫方法寫方法override修飾修飾virtual不能與不能與static、abstract或或override中任中任一個(gè)同時(shí)出現(xiàn);一個(gè)同時(shí)出現(xiàn);override不能與不能與new、sta
9、tic、virtual或或abstract中任一個(gè)同時(shí)運(yùn)用;中任一個(gè)同時(shí)運(yùn)用;4.1.2 隱藏與多態(tài)實(shí)例隱藏與多態(tài)實(shí)例隱藏與多態(tài)隱藏與多態(tài)class A public void E() Console.WriteLine(“A.E); public void F() Console.WriteLine(“A.F); public virtual void G() Console.WriteLine(“A.G); class B:A public void E() Console.WriteLine(“B.E); public new void F() Console.WriteLine(“B.
10、F); public override void G() Console.WriteLine(“B.G); class Test public static void Main() B b=new B(); A a=b; a.E(); b.E(); a.F(); b.F(); a.G(); b.G(); 輸出結(jié)果:輸出結(jié)果:A.EB.EA.FB.FB.GB.G父類可以援用子類對(duì)象,父類援用只能調(diào)用子類承繼自父類的方法,父類可以援用子類對(duì)象,父類援用只能調(diào)用子類承繼自父類的方法,父類不能調(diào)用子類獨(dú)有的方法。父類不能調(diào)用子類獨(dú)有的方法。4.1.2 隱藏與多態(tài)實(shí)例隱藏與多態(tài)實(shí)例隱藏與多態(tài)隱藏與多態(tài)c
11、lass A public virtual void F() Console.WriteLine(“A.F); class B:A public override void F() Console.WriteLine(“B.F); class C :B new public virtual void F() Console.WriteLine(“C.F); class D :C public override void F() Console.WriteLine(“D.F); class Test public static void Main() D d=new D(); A a=d; B
12、b=d; C c=d; a.F(); b.F(); c.F(); d.F(); 輸出結(jié)果:輸出結(jié)果:B.FB.FD.FD.F4.1.2 多態(tài)多態(tài)籠統(tǒng)類與籠統(tǒng)方法籠統(tǒng)類與籠統(tǒng)方法 籠統(tǒng)類:是一種特殊的基類,該類并不與詳細(xì)的事物發(fā)生籠統(tǒng)類:是一種特殊的基類,該類并不與詳細(xì)的事物發(fā)生聯(lián)絡(luò);例如幾何體,計(jì)算幾何體體積的方法不能夠有詳細(xì)聯(lián)絡(luò);例如幾何體,計(jì)算幾何體體積的方法不能夠有詳細(xì)實(shí)現(xiàn)過程,只需詳細(xì)某一種幾何體才有求體積的方法;實(shí)現(xiàn)過程,只需詳細(xì)某一種幾何體才有求體積的方法; 籠統(tǒng)類是指在基類的定義中聲明不包含任何實(shí)現(xiàn)代碼的方籠統(tǒng)類是指在基類的定義中聲明不包含任何實(shí)現(xiàn)代碼的方法,實(shí)踐上就是一個(gè)不具有
13、任何詳細(xì)功能的方法,即籠統(tǒng)法,實(shí)踐上就是一個(gè)不具有任何詳細(xì)功能的方法,即籠統(tǒng)方法。該方法的獨(dú)一作用就是讓派生類來重寫;方法。該方法的獨(dú)一作用就是讓派生類來重寫; 在基類定義中,只需類體中包含一個(gè)籠統(tǒng)方法,該類即為在基類定義中,只需類體中包含一個(gè)籠統(tǒng)方法,該類即為籠統(tǒng)類。籠統(tǒng)類。4.1.2 多態(tài)多態(tài)籠統(tǒng)類與籠統(tǒng)方法籠統(tǒng)類與籠統(tǒng)方法public abstract class 類名類名 public abstract 前往類型前往類型 方法稱號(hào)參數(shù)列表;方法稱號(hào)參數(shù)列表; 聲明籠統(tǒng)類與籠統(tǒng)方法聲明籠統(tǒng)類與籠統(tǒng)方法不包含方法體,不包含方法體, 也不能要也不能要4.1.2 多態(tài)多態(tài)籠統(tǒng)類與籠統(tǒng)方法籠統(tǒng)類
14、與籠統(tǒng)方法籠統(tǒng)類幾點(diǎn)闡明籠統(tǒng)類幾點(diǎn)闡明一個(gè)類中只需包含一個(gè)籠統(tǒng)方法,該類即為籠統(tǒng)類;反之一個(gè)類中只需包含一個(gè)籠統(tǒng)方法,該類即為籠統(tǒng)類;反之,一個(gè)籠統(tǒng)類中必需包含籠統(tǒng)方法;,一個(gè)籠統(tǒng)類中必需包含籠統(tǒng)方法;籠統(tǒng)類中可以包含非籠統(tǒng)方法;籠統(tǒng)類中可以包含非籠統(tǒng)方法;籠統(tǒng)類不能實(shí)例化,不能用籠統(tǒng)類不能實(shí)例化,不能用new生成實(shí)例;生成實(shí)例;籠統(tǒng)類不能被密封?;\統(tǒng)類不能被密封。派生類闡明派生類闡明假設(shè)基類為籠統(tǒng)類,那么要求派生類必需重載實(shí)現(xiàn)基類中假設(shè)基類為籠統(tǒng)類,那么要求派生類必需重載實(shí)現(xiàn)基類中一切籠統(tǒng)方法。一切籠統(tǒng)方法?;\統(tǒng)方法闡明籠統(tǒng)方法闡明籠統(tǒng)方法沒有方法體,只需一個(gè)方法頭后跟一個(gè)分號(hào);籠統(tǒng)方法沒有
15、方法體,只需一個(gè)方法頭后跟一個(gè)分號(hào);籠統(tǒng)方法被隱含以為是一種虛方法,派生類中必需重寫一籠統(tǒng)方法被隱含以為是一種虛方法,派生類中必需重寫一切籠統(tǒng)方法,且重寫的方法與籠統(tǒng)方法的參數(shù)及類型、方切籠統(tǒng)方法,且重寫的方法與籠統(tǒng)方法的參數(shù)及類型、方法名都應(yīng)一樣。法名都應(yīng)一樣。4.1.2 多態(tài)多態(tài)籠統(tǒng)類與籠統(tǒng)方法籠統(tǒng)類與籠統(tǒng)方法public abstract class Shape protected double x; protected double y; protected double z; public Shape(double dx, double dy, double dz) x=dx; y=
16、dy; z=dz; public abstract double Cubage();定義籠統(tǒng)類及籠統(tǒng)方法定義籠統(tǒng)類及籠統(tǒng)方法4.1.2 多態(tài)多態(tài)籠統(tǒng)類與籠統(tǒng)方法籠統(tǒng)類與籠統(tǒng)方法public class Cuboid:Shape public Cuboid(double dx, double dy, double dz) :base(dx,dy,dz) public override double Cubage() return x * y * z; 重載籠統(tǒng)方法重載籠統(tǒng)方法4.1.2 多態(tài)多態(tài)籠統(tǒng)類與籠統(tǒng)方法籠統(tǒng)類與籠統(tǒng)方法 虛方法與籠統(tǒng)方法區(qū)別虛方法與籠統(tǒng)方法區(qū)別 籠統(tǒng)方法必需在籠統(tǒng)類中定義
17、,虛方法可以在籠統(tǒng)類或普籠統(tǒng)方法必需在籠統(tǒng)類中定義,虛方法可以在籠統(tǒng)類或普通類中定義;通類中定義; 在基類中,虛方法用在基類中,虛方法用virtual關(guān)鍵字,籠統(tǒng)方法用關(guān)鍵字,籠統(tǒng)方法用abstract關(guān)鍵字;關(guān)鍵字; 在派生類中,虛方法不一定重寫,籠統(tǒng)方法一定要重寫;在派生類中,虛方法不一定重寫,籠統(tǒng)方法一定要重寫;修飾符小結(jié)修飾符小結(jié)基類方法基類方法abstractvirtualoverride無闡明符無闡明符new(無闡明符無闡明符)override派生類方法派生類方法4.1.2 多態(tài)多態(tài)密封類和密封方法密封類和密封方法密封類:不允許被承繼的類。密封類:不允許被承繼的類。定義密封類定義密
18、封類訪問修飾符訪問修飾符 sealed class 類稱號(hào)類稱號(hào) 類體類體 public sealed class SealedClass public string method( ) return 我是密封類我是密封類; 定義密封類定義密封類4.1.2 多態(tài)多態(tài)密封類和密封方法密封類和密封方法 基類中要密封的方法必需有基類中要密封的方法必需有virtual、abstract或或override 派生類中的密封方法必需同時(shí)有派生類中的密封方法必需同時(shí)有sealed override。定義密封方法定義密封方法訪問修飾符訪問修飾符 sealed override 前往類型前往類型 方法名參數(shù)列表
19、方法名參數(shù)列表 方法體方法體 4.1.2 多態(tài)多態(tài)密封類和密封方法密封類和密封方法密封方法密封方法class A public virtual void F() Console.WriteLine(“A.F); class B:A public sealed override void F() Console.WriteLine(“B.F); class C :B public override void F() Console.WriteLine(“C.F); class Test public static void Main() C c=new C(); c.F(); sealed必需與
20、必需與override同時(shí)出現(xiàn)同時(shí)出現(xiàn)不允許重寫不允許重寫F方法方法假設(shè)無假設(shè)無override那么為那么為隱藏隱藏4.3 類型轉(zhuǎn)換類型轉(zhuǎn)換4.3.1 隱式類型轉(zhuǎn)換隱式類型轉(zhuǎn)換4.3.2 顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換4.3.3 運(yùn)用運(yùn)用Convert轉(zhuǎn)換轉(zhuǎn)換為什么需求類型轉(zhuǎn)換為什么需求類型轉(zhuǎn)換編譯器要確切地知道數(shù)據(jù)的類型編譯器要確切地知道數(shù)據(jù)的類型int num = 123 ;整數(shù)整數(shù)字符串字符串需求類型轉(zhuǎn)換!需求類型轉(zhuǎn)換!編譯出錯(cuò)編譯出錯(cuò)4.3.1 隱式類型轉(zhuǎn)換隱式類型轉(zhuǎn)換隱式轉(zhuǎn)換:自動(dòng)類型轉(zhuǎn)換隱式轉(zhuǎn)換:自動(dòng)類型轉(zhuǎn)換規(guī)那么:對(duì)于數(shù)值類型,規(guī)那么:對(duì)于數(shù)值類型,A的取值范圍完全包含在的取值范圍完全
21、包含在B內(nèi)內(nèi)ABstatic void Main(string args) double score = 58.5; / 原始成果原始成果 int bonus = 2; / 加分加分 int sum; / 總分總分 sum = score + bonus; / 計(jì)算總分計(jì)算總分 Console.WriteLine(sum); Console.ReadLine();4.3.2 顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換static void Main(string args) double score = 58.5; int bonus = 2; int sum; sum = (int)score + bonus
22、; Console.WriteLine(sum); Console.ReadLine();明確通知編譯器轉(zhuǎn)換類型明確通知編譯器轉(zhuǎn)換類型留意:留意:double (58.5)-int (58),精度能夠喪失!,精度能夠喪失!顯式轉(zhuǎn)換:強(qiáng)迫類型轉(zhuǎn)換顯式轉(zhuǎn)換:強(qiáng)迫類型轉(zhuǎn)換運(yùn)用運(yùn)用 Parse() 進(jìn)展轉(zhuǎn)換進(jìn)展轉(zhuǎn)換字符串和數(shù)值型的相互轉(zhuǎn)換字符串和數(shù)值型的相互轉(zhuǎn)換 int.Parse( )float.Parse( )double.Parse( )ToString()必需是數(shù)字的必需是數(shù)字的有效表示方式!有效表示方式!4.3.3 運(yùn)用運(yùn)用 Convert 類進(jìn)展轉(zhuǎn)換類進(jìn)展轉(zhuǎn)換 運(yùn)用 Convert :Co
23、nvert.ToXxx(object value)Convert.ToInt32()Convert.ToSingle()Convert.ToString()double85.63string85.63int86float85.63Parse 與與 ConvertXxx.Parse(string)目的類型的有效表示方式目的類型的有效表示方式 Convert.ToXxx(object):注:注:Xxx表示某種類型表示某種類型字符串字符串其他類型其他類型恣意類型恣意類型其他類型其他類型4.4 構(gòu)造與接口構(gòu)造與接口訪問修飾符訪問修飾符struct 構(gòu)造名構(gòu)造名 構(gòu)造主體構(gòu)造主體 訪問修飾符:訪問修飾符
24、:public:表示不限制對(duì)構(gòu)造的訪問;:表示不限制對(duì)構(gòu)造的訪問;internal: 可被同一個(gè)工程的程序訪問默許;可被同一個(gè)工程的程序訪問默許;構(gòu)呵斥員包括字段、屬性、方法等;構(gòu)呵斥員包括字段、屬性、方法等;構(gòu)造可以定義構(gòu)造函數(shù),但不能定義析構(gòu)函數(shù);構(gòu)造可以定義構(gòu)造函數(shù),但不能定義析構(gòu)函數(shù);有一個(gè)默許的不帶參數(shù)的構(gòu)造函數(shù),有一個(gè)默許的不帶參數(shù)的構(gòu)造函數(shù), 用于對(duì)構(gòu)造的字段進(jìn)展初始化,并用于對(duì)構(gòu)造的字段進(jìn)展初始化,并且構(gòu)造的默許構(gòu)造函數(shù)不能被重寫。且構(gòu)造的默許構(gòu)造函數(shù)不能被重寫。構(gòu)造的聲明構(gòu)造的聲明4.4 構(gòu)造與接口構(gòu)造與接口構(gòu)造與類的區(qū)別構(gòu)造與類的區(qū)別結(jié)結(jié) 構(gòu)構(gòu)類類值類型值類型引用類型引用類
25、型可以不使用可以不使用new實(shí)例化實(shí)例化必須使用必須使用new初始化初始化不可以添加無參構(gòu)造函數(shù)不可以添加無參構(gòu)造函數(shù)可以添加無參構(gòu)造函數(shù)可以添加無參構(gòu)造函數(shù)沒有析構(gòu)函數(shù)沒有析構(gòu)函數(shù)有析構(gòu)函數(shù)有析構(gòu)函數(shù)沒有沒有abstract,protected和和sealed修飾符修飾符可以使用可以使用abstract,protected和和sealed修飾符修飾符不支持繼承不支持繼承支持繼承支持繼承適用于表示小的數(shù)據(jù)結(jié)構(gòu)適用于表示小的數(shù)據(jù)結(jié)構(gòu)適用于表示任何數(shù)據(jù)結(jié)構(gòu)適用于表示任何數(shù)據(jù)結(jié)構(gòu)4.4 構(gòu)造與接口構(gòu)造與接口struct account public string name; public doubl
26、e balance; public account(string n,double b) name=n;balance=b; 構(gòu)造定義及運(yùn)用一構(gòu)造定義及運(yùn)用一4.4 構(gòu)造與接口構(gòu)造與接口構(gòu)造定義及運(yùn)用構(gòu)造定義及運(yùn)用( (一續(xù)一續(xù)class Test public static void Main() account acc1=new account(“張三,張三,3000); /顯式構(gòu)造函數(shù)顯式構(gòu)造函數(shù) account acc2=new account(); /缺省構(gòu)造函數(shù)缺省構(gòu)造函數(shù)account acc3; /沒有構(gòu)造函數(shù)沒有構(gòu)造函數(shù)Console.WriteLine(+
27、“has a balance of +acc1.balance);if(=null) Console.WriteLine(“ is null); Console.WriteLine(“acc2.balance is +acc2.balance); /運(yùn)用運(yùn)用acc3以前,必需初始化以前,必需初始化acc3 =“Mary; acc3.balance=2000; Console.WriteLine(+“has a balance of +acc3.balance); 4.4 構(gòu)造與接口構(gòu)造與接口struct MyStruct
28、public int x; public int y; public MyStruct(int i, int j)x = i;y = j; public void Sum() int sum=x+y; Console.WriteLine(“The sum is 0,sum); 構(gòu)造定義及運(yùn)用二構(gòu)造定義及運(yùn)用二4.4 構(gòu)造與接口構(gòu)造與接口class Test static void Main() MyStruct s1 = new MyStruct(1,2); MyStruct s2 = s1; s1.x = 2; s1.Sum(); s2.Sum(); 構(gòu)造定義及運(yùn)用二續(xù)構(gòu)造定義及運(yùn)用二續(xù)輸出
29、結(jié)果:輸出結(jié)果:The sum is 4The sum is 3值傳送值傳送4.4 構(gòu)造與接口構(gòu)造與接口 接口聲明定義了一個(gè)協(xié)定,運(yùn)用接口的類或構(gòu)造必需遵守接口聲明定義了一個(gè)協(xié)定,運(yùn)用接口的類或構(gòu)造必需遵守其協(xié)定。接口可以從多個(gè)基接口承繼,而類或構(gòu)造可以實(shí)其協(xié)定。接口可以從多個(gè)基接口承繼,而類或構(gòu)造可以實(shí)現(xiàn)多個(gè)接口;現(xiàn)多個(gè)接口; 接口成員只能是方法、屬性、索引和事件,不能有字段。接口成員只能是方法、屬性、索引和事件,不能有字段。 接口本身不提供它所定義成員的實(shí)現(xiàn)代碼,只指定實(shí)現(xiàn)該接口本身不提供它所定義成員的實(shí)現(xiàn)代碼,只指定實(shí)現(xiàn)該接口的類或構(gòu)造必需提供的成員的調(diào)用方式。接口的類或構(gòu)造必需提供的成
30、員的調(diào)用方式。4.4 構(gòu)造與接口構(gòu)造與接口訪問修飾符訪問修飾符 interface 接口名接口名 :基接口:基接口1,基接口,基接口2. 接口體接口體 訪問修飾符:訪問修飾符:public:表示不限制對(duì)類的訪問;:表示不限制對(duì)類的訪問;internal: 可被同一個(gè)工程的程序訪問默許;可被同一個(gè)工程的程序訪問默許;接口成員包括屬性、方法等;接口成員包括屬性、方法等;接口不能包括字段,也不能定義構(gòu)造函數(shù)和析構(gòu)函數(shù);接口不能包括字段,也不能定義構(gòu)造函數(shù)和析構(gòu)函數(shù);接口成員訪問修飾符默以為接口成員訪問修飾符默以為public;接口的命名通常是以接口的命名通常是以I開頭,如開頭,如IPartA。接口的
31、聲明接口的聲明4.4 構(gòu)造與接口構(gòu)造與接口 接口的實(shí)現(xiàn)接口的實(shí)現(xiàn) 函數(shù)成員的實(shí)現(xiàn):類、構(gòu)造;函數(shù)成員的實(shí)現(xiàn):類、構(gòu)造; 實(shí)現(xiàn)接口類型:實(shí)現(xiàn)接口類型: public成員實(shí)現(xiàn)成員實(shí)現(xiàn) 顯示接口成員實(shí)現(xiàn)顯示接口成員實(shí)現(xiàn) 不能用不能用new操作符創(chuàng)建接口的實(shí)例操作符創(chuàng)建接口的實(shí)例4.4 構(gòu)造與接口構(gòu)造與接口 public成員實(shí)現(xiàn)成員實(shí)現(xiàn) 實(shí)現(xiàn)接口成員時(shí),聲明成員為實(shí)現(xiàn)接口成員時(shí),聲明成員為public,這樣的實(shí),這樣的實(shí)現(xiàn)聲明稱為現(xiàn)聲明稱為public接口成員實(shí)現(xiàn)聲明,簡(jiǎn)稱接口成員實(shí)現(xiàn)聲明,簡(jiǎn)稱public成員實(shí)現(xiàn)或成員實(shí)現(xiàn)或public實(shí)現(xiàn)實(shí)現(xiàn); public實(shí)現(xiàn)的成員具有雙重訪問性,由于它是接實(shí)現(xiàn)
32、的成員具有雙重訪問性,由于它是接口成員的實(shí)現(xiàn),所以可以經(jīng)過接口實(shí)例來訪問,口成員的實(shí)現(xiàn),所以可以經(jīng)過接口實(shí)例來訪問,又由于它是又由于它是public成員,還可以經(jīng)過類或構(gòu)造的成員,還可以經(jīng)過類或構(gòu)造的實(shí)例來訪問。實(shí)例來訪問。4.4 構(gòu)造與接口構(gòu)造與接口interface IA void p();class B:IA public void p() /代碼實(shí)現(xiàn)代碼實(shí)現(xiàn) class Test public static void Main() B b=new B(); b.p(); IA a=b; a.p(); public成員實(shí)現(xiàn)成員實(shí)現(xiàn)(一一)正確正確正確正確4.4 構(gòu)造與接口構(gòu)造與接口pub
33、lic成員實(shí)現(xiàn)二成員實(shí)現(xiàn)二interface IPoint int Xget;set; int Yget;set;class MyPoint:IPoint private int myX,myY; public MyPoint(int x,int y) myX=x;myY=y; public int X /對(duì)屬性對(duì)屬性X的的public實(shí)現(xiàn)聲明實(shí)現(xiàn)聲明 getreturn myX; setmyX=value; public int Y /對(duì)屬性對(duì)屬性Y的的public實(shí)現(xiàn)聲明實(shí)現(xiàn)聲明 getreturn myY; setmyY=value; 4.4 構(gòu)造與接口構(gòu)造與接口class MainCl
34、ass /經(jīng)過接口調(diào)用經(jīng)過接口調(diào)用 public static void PrintPoint(IPoint p) Console.WriteLine(“x=0,y=1,p.X,p.Y); public static void Main() MyPoint p=new MyPoint(2,3); Console.Write(“MyPoint:); PrintPoint(p); public成員實(shí)現(xiàn)二續(xù)成員實(shí)現(xiàn)二續(xù)輸出結(jié)果:輸出結(jié)果:MyPoint:x=2,y=34.4 構(gòu)造與接口構(gòu)造與接口 顯式接口成員實(shí)現(xiàn)顯式接口成員實(shí)現(xiàn) 用接口成員的完全限定名接口名用接口成員的完全限定名接口名.成員名來顯成
35、員名來顯式指定要實(shí)現(xiàn)的接口成員,這樣的實(shí)現(xiàn)聲明稱為式指定要實(shí)現(xiàn)的接口成員,這樣的實(shí)現(xiàn)聲明稱為顯式接口成員實(shí)現(xiàn)聲明,簡(jiǎn)稱顯式實(shí)現(xiàn)聲明顯式接口成員實(shí)現(xiàn)聲明,簡(jiǎn)稱顯式實(shí)現(xiàn)聲明; 留意:顯式實(shí)現(xiàn)聲明中不能用留意:顯式實(shí)現(xiàn)聲明中不能用public修飾符。修飾符。4.4 構(gòu)造與接口構(gòu)造與接口interface IA void p();class B:IA void IA.p() /代碼實(shí)現(xiàn)代碼實(shí)現(xiàn) class Test public static void Main() B b=new B(); b.p(); IA a=b; a.p(); 顯式成員實(shí)現(xiàn)顯式成員實(shí)現(xiàn)(一一)錯(cuò)誤錯(cuò)誤正確正確4.4 構(gòu)造與接口
36、構(gòu)造與接口interface IA void p(); interface IB void p(); class C:IA,IB void IA.p()Console.WriteLine(“A.p); void IB.p()Console.WriteLine(“B.p); public void p() Console.WriteLine(“C.p); class Test public static void Main() C c=new C(); c.p(); (IA)c).p(); (IB)c).p(); 顯式成員實(shí)現(xiàn)顯式成員實(shí)現(xiàn)(二二)輸出結(jié)果:輸出結(jié)果:C.pA.pB.p4.4 構(gòu)造
37、與接口構(gòu)造與接口interface IA void p(); class B:IA void IA.p()Console.WriteLine(“A.p); public void p() Console.WriteLine(“B.p); class C:B,IA public static void Main() B b=new B(); IA a=b; a.p(); /顯式接口成員實(shí)現(xiàn)優(yōu)顯式接口成員實(shí)現(xiàn)優(yōu)先先 C c=new C(); a=c; c.p(); a.p(); 顯式成員實(shí)現(xiàn)顯式成員實(shí)現(xiàn)(三三)輸出結(jié)果:輸出結(jié)果:A.pB.pA.p類可以同時(shí)有一個(gè)基類和零個(gè)以類可以同時(shí)有一個(gè)基類和
38、零個(gè)以上的接口,并將基類寫在前面上的接口,并將基類寫在前面4.6 異常處置異常處置 異常異常 指由于程序運(yùn)轉(zhuǎn)時(shí)發(fā)生的錯(cuò)誤,從而導(dǎo)致程序錯(cuò)指由于程序運(yùn)轉(zhuǎn)時(shí)發(fā)生的錯(cuò)誤,從而導(dǎo)致程序錯(cuò)誤終了。誤終了。 異常處置異常處置 當(dāng)程序運(yùn)轉(zhuǎn)過程中發(fā)生了某個(gè)異常景象,系統(tǒng)當(dāng)程序運(yùn)轉(zhuǎn)過程中發(fā)生了某個(gè)異常景象,系統(tǒng)將產(chǎn)生一個(gè)相應(yīng)的異常類對(duì)象,并把它交給系統(tǒng)將產(chǎn)生一個(gè)相應(yīng)的異常類對(duì)象,并把它交給系統(tǒng)處置,系統(tǒng)擔(dān)任找四處置錯(cuò)誤的代碼并執(zhí)行,處置,系統(tǒng)擔(dān)任找四處置錯(cuò)誤的代碼并執(zhí)行, 如如除數(shù)為除數(shù)為0。4.6 異常處置異常處置 運(yùn)用語(yǔ)句或表達(dá)式在執(zhí)行過程中自動(dòng)引發(fā)了某個(gè)異常的條運(yùn)用語(yǔ)句或表達(dá)式在執(zhí)行過程中自動(dòng)引發(fā)了某個(gè)異
39、常的條件件,使得操作無法正常終了使得操作無法正常終了,從而引發(fā)異常;從而引發(fā)異常; 運(yùn)用顯式運(yùn)用顯式 throw 語(yǔ)句來引發(fā)異常。在此情況下,控制權(quán)語(yǔ)句來引發(fā)異常。在此情況下,控制權(quán)將無條件轉(zhuǎn)四處置異常的部分代碼。將無條件轉(zhuǎn)四處置異常的部分代碼。引發(fā)異常兩種方式引發(fā)異常兩種方式C#中異常處置語(yǔ)句中異常處置語(yǔ)句 trycatch trycatchfinally tryfinally throw4.6 異常處置異常處置try 被監(jiān)控的能夠發(fā)生異常的程序代被監(jiān)控的能夠發(fā)生異常的程序代碼碼catch(異常類名異常類名 異常變量名異常變量名) 異常處置異常處置格式格式1 1try 被監(jiān)控的能夠發(fā)生異常的
40、程序代被監(jiān)控的能夠發(fā)生異常的程序代碼碼finally 最終要執(zhí)行的代碼最終要執(zhí)行的代碼格式格式2 2try 被監(jiān)控的能夠發(fā)生異常的程序代被監(jiān)控的能夠發(fā)生異常的程序代碼碼catch(異常類名異常類名 異常變量名異常變量名) 異常處置異常處置finally 最終要執(zhí)行的代碼最終要執(zhí)行的代碼格式格式3 34.6 異常處置異常處置 try子句包含能夠引起異常的代碼;子句包含能夠引起異常的代碼; 只需發(fā)生異常時(shí)才執(zhí)行只需發(fā)生異常時(shí)才執(zhí)行catch子句,假設(shè)沒有異常,子句,假設(shè)沒有異常,try子句子句正常終了,正常終了,catch子句被忽略,程序轉(zhuǎn)到子句被忽略,程序轉(zhuǎn)到catch后的第一條語(yǔ)后的第一條語(yǔ)句
41、開場(chǎng)執(zhí)行;句開場(chǎng)執(zhí)行; 可以包含多個(gè)可以包含多個(gè)catch語(yǔ)句;語(yǔ)句; catch子句可以不包括參數(shù),它將捕獲一切類型的異常;子句可以不包括參數(shù),它將捕獲一切類型的異常; 異常類名必需為異常類名必需為System.Exception或從或從System.Exception派生的類型;派生的類型; finally子句不論有沒有異常都執(zhí)行。子句不論有沒有異常都執(zhí)行。4.6 異常處置異常處置異常類名稱異常類名稱說明說明ArithmeticException錯(cuò)誤:由于數(shù)學(xué)運(yùn)算導(dǎo)致的異常FormatException參數(shù)的格式不正確ArgumentNullException參數(shù)為空:給方法傳遞一個(gè)不可接
42、受的空參數(shù)MemberAccessException訪問錯(cuò)誤:類型成員不能被訪問數(shù)學(xué)計(jì)算ArrayTypeMismatchException數(shù)組類型不匹配DivideByZeroException被零除ArgumentException參數(shù)錯(cuò)誤:方法的參數(shù)無效IndexOutOfRangeException索引超出范圍InvalidCastException非法強(qiáng)制轉(zhuǎn)換,在顯式轉(zhuǎn)換失敗時(shí)引發(fā)MulticastNotSupportedException不支持的組播:組合兩個(gè)非空委派時(shí)引發(fā)NotSupportedException調(diào)用的方法在類中沒有實(shí)現(xiàn)NullReferenceException
43、引用空引用對(duì)象時(shí)引發(fā)OutOfMemoryException無法為新語(yǔ)句分配內(nèi)存時(shí)引發(fā),內(nèi)存不足OverflowException溢出StackOverflowException棧溢出NotFiniteNumberException無限大的值:數(shù)字不合法4.6 異常處置異常處置int num1, num2,result;try num1 = int.Parse(Console.ReadLine(); num2 = int.Parse(Console.ReadLine(); result = num1 / num2; Console.WriteLine(“商是商是+result);catch(D
44、ivideByZeroException error) Console.WriteLine(除數(shù)不能為零!除數(shù)不能為零!); catch (FormatException error) Console.WriteLine(輸入格式錯(cuò)誤!輸入格式錯(cuò)誤!); catch(Exception ex) /假設(shè)寫,寫在假設(shè)寫,寫在catch的最后的最后 Console.WriteLine(“輸入錯(cuò)誤輸入錯(cuò)誤);finally Console.WriteLine(謝謝運(yùn)用!謝謝運(yùn)用!);異常處置異常處置4.6 異常處置異常處置throw異常處置異常處置static int Divide(int x,int
45、 y) try int z=x/y; return z; catch(DivideByZeroException error) throw new DivideByZeroException(“除除數(shù)不能為數(shù)不能為0); static void Main() int num1, num2,result; try num1 = int.Parse(Console.ReadLine(); num2 = int.Parse(Console.ReadLine(); result = Divide(num1,num2); Console.WriteLine(“商是商是+result);catch(Div
46、ideByZeroException error) Console.WriteLine(error.Message);catch (FormatException error) Console.WriteLine(輸入格式錯(cuò)誤!輸入格式錯(cuò)誤!);catch(Exception ex) Console.WriteLine(“輸入錯(cuò)誤輸入錯(cuò)誤);finally Console.WriteLine(謝謝運(yùn)用!謝謝運(yùn)用!); 4.7 委托委托 委托也叫代理,就是把事情交給他人去辦,如委托律師代理委托也叫代理,就是把事情交給他人去辦,如委托律師代理打官司,委托同窗代買火車票;打官司,委托同窗代買火車票;
47、 C#中假設(shè)將一個(gè)方法委托給一個(gè)代理對(duì)象,那么這個(gè)對(duì)象就中假設(shè)將一個(gè)方法委托給一個(gè)代理對(duì)象,那么這個(gè)對(duì)象就可以全權(quán)代理這個(gè)方法的執(zhí)行;可以全權(quán)代理這個(gè)方法的執(zhí)行; 運(yùn)用委托首先要定義委托,聲明委托能代理什么類型的方法運(yùn)用委托首先要定義委托,聲明委托能代理什么類型的方法,就像房產(chǎn)中介能代理抵押貸款業(yè)務(wù),而不能代理打官司;,就像房產(chǎn)中介能代理抵押貸款業(yè)務(wù),而不能代理打官司; 委托是一種類型委托是一種類型,即它與即它與class , interface , struct ,enum處處于同一級(jí)別于同一級(jí)別,而且它是援用類型;而且它是援用類型; 任何委托類型都是任何委托類型都是system.deleg
48、ate類的派生類。類的派生類。4.7 委托委托 何時(shí)運(yùn)用委托?何時(shí)運(yùn)用委托? 1回調(diào)函數(shù);回調(diào)函數(shù); 2多線程編程中運(yùn)用委托來指定啟動(dòng)一個(gè)線程時(shí)調(diào)用的多線程編程中運(yùn)用委托來指定啟動(dòng)一個(gè)線程時(shí)調(diào)用的方法;方法; 3C#中的事件模型。用它們指明處置給定事件的方法中的事件模型。用它們指明處置給定事件的方法。4.7 委托委托 委托用法步驟:委托用法步驟: 1定義委托定義委托 訪問修飾符訪問修飾符 delegate 代理方法的前往值類型代理方法的前往值類型 委托類型名委托類型名代理方法參數(shù)列表代理方法參數(shù)列表 2聲明委托變量聲明委托變量 委托類型名委托類型名 委托對(duì)象;委托對(duì)象; 3實(shí)例化委托變量實(shí)例化
49、委托變量 委托對(duì)象委托對(duì)象=new 委托類型對(duì)象名委托類型對(duì)象名.方法名方法名/調(diào)用某類的實(shí)例調(diào)用某類的實(shí)例方法方法 委托對(duì)象委托對(duì)象=new 委托類型類名委托類型類名.方法名方法名/調(diào)用某類的靜態(tài)方調(diào)用某類的靜態(tài)方法法 4調(diào)用委托,實(shí)現(xiàn)方法調(diào)用委托,實(shí)現(xiàn)方法 委托對(duì)象實(shí)參委托對(duì)象實(shí)參實(shí)例化時(shí)必需指定實(shí)例化時(shí)必需指定方法名方法名4.7 委托委托Void Multiply(int,int).Void Divide(int,int).可以援用任何方法,將在運(yùn)轉(zhuǎn)時(shí)決議委托和方法必需具有一樣的簽名-public delegate void Call(int num1, int num2);-4.7 委托委托定義委托定義委托namespace Delegates public delegate int Call(int num1, int num2); class Math public int Multiply(int num1, int num2) return num1*num2; public int Divide(int num1, int num2) return num1/num2; class TestDelegates publi
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年冀教版八年級(jí)歷史上冊(cè)月考試卷含答案
- 2025年人教新起點(diǎn)選修6歷史下冊(cè)月考試卷
- 2025年度歐盟電子商務(wù)政策實(shí)施細(xì)則合同4篇
- 房屋遺產(chǎn)繼承合同(2篇)
- 擔(dān)保合同責(zé)任協(xié)議書(2篇)
- 2025年度木跳板租賃與售后服務(wù)采購(gòu)合同規(guī)范3篇
- 二零二五版摩托車零部件質(zhì)量檢測(cè)與認(rèn)證合同4篇
- 2025年個(gè)人創(chuàng)業(yè)風(fēng)險(xiǎn)投資合同范本4篇
- 2025年度個(gè)人與企業(yè)合租創(chuàng)意工作室合同3篇
- 二零二五年度苗木種植基地信息化建設(shè)合同4篇
- 2025水利云播五大員考試題庫(kù)(含答案)
- 老年髖部骨折患者圍術(shù)期下肢深靜脈血栓基礎(chǔ)預(yù)防專家共識(shí)(2024版)解讀
- 中藥飲片驗(yàn)收培訓(xùn)
- 手術(shù)室??谱o(hù)士工作總結(jié)匯報(bào)
- DB34T 1831-2013 油菜收獲與秸稈粉碎機(jī)械化聯(lián)合作業(yè)技術(shù)規(guī)范
- 蘇州市2025屆高三期初陽(yáng)光調(diào)研(零模)政治試卷(含答案)
- 創(chuàng)傷處理理論知識(shí)考核試題及答案
- (正式版)HG∕T 21633-2024 玻璃鋼管和管件選用規(guī)定
- 《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)》測(cè)試題+答案
- 殘疾軍人新退休政策
- 《鐵路超限超重貨物運(yùn)輸規(guī)則》(2016)260
評(píng)論
0/150
提交評(píng)論