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

下載本文檔

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

文檔簡介

1、第六章 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ),,6.1 類和對象的基本特性 6.2 類的建立和實(shí)例化 6.3 繼承和派生 6.4 綜合應(yīng)用6.5 自主學(xué)習(xí)—重載與重寫,本章內(nèi)容,面向?qū)ο?分析解決問題所需步驟 用函數(shù)實(shí)現(xiàn)步驟 使用時(shí)按順序依次調(diào)用函數(shù)例如:汽車啟動(dòng);汽車到站;,將現(xiàn)實(shí)世界的事物抽象成對象,現(xiàn)實(shí)世界中的關(guān)系抽象成類、繼承,幫助人們實(shí)現(xiàn)對現(xiàn)實(shí)世界的抽象與數(shù)字建模。 用“對象”的思想方法

2、來分析和設(shè)計(jì)程序。,什么是對象,生活中的“對象”就是東西,任何東西都可以看成是對象把一個(gè)東西看成對象,可以孤立地觀察它的性質(zhì)、行為,進(jìn)而研究它與其他對象的關(guān)系。,對象,,顏色,型號,出廠日期,開機(jī),切換頻道,關(guān)機(jī),,,,,,在程序中使用對象的概念程序看成是很多對象相互作用的結(jié)果。,對象,處理文件,播放聲音,顯示文件,類是對象的“藍(lán)圖”。類規(guī)定了對象的特征。對象是根據(jù)“藍(lán)圖”生產(chǎn)出的產(chǎn)品。從同一個(gè)類產(chǎn)生出的對象具有相同的結(jié)構(gòu)和規(guī)

3、格,卻在某些特性上有其不同之處??傊?,類是現(xiàn)實(shí)生活中一類具有共同特征的事物的抽象。類是對象的模板,對象是類的實(shí)例。,類,,,,,月餅?zāi)P停悾?月餅(對象),實(shí)例化,遙控器控制電視,只需按下按鈕就能切換頻道不需要知道電視如何接收信號和搜索頻道使用者把電視看成一個(gè)對象,如同一個(gè)“黑盒子”,只需要知道如何操作它即可。,面向?qū)ο蟮奶攸c(diǎn)—封裝,筆記本電腦的封裝性: 封裝了CPU、內(nèi)存、硬

4、盤、網(wǎng)卡、聲卡等 提供了USB接口、網(wǎng)卡接口、音頻接口等面向?qū)ο蟪绦蛟O(shè)計(jì)的封裝性: 將數(shù)據(jù)、屬性、事件和方法集合在一個(gè)類中。,,數(shù)據(jù)屬性事件方法,類的定義 對象的聲明 TextBox textBox1;對象實(shí)例化 textBox1 = new TextBox();對象屬性設(shè)置 調(diào)用方法 textBox1.focus();響應(yīng)事件,如:“TextBox”類,Class Text

5、Box{ ……},textBox1.Name = "textBox1";textBox1.Text = "我是No.1";,void textBox1_KeyPress(……){……},電視機(jī)不斷發(fā)展黑白?彩色?高清但聲音、圖像的功能一直延續(xù)下來后一代“繼承”前一代的功能并有所發(fā)展舊電視派生出新電視新電視繼承了舊電視,面向?qū)ο蟮奶攸c(diǎn)—繼承,派生,派生,繼承,

6、繼承,基類(父類)?派生類(子類),繼承性示例:,,繼承 派生,CSCircle: 繼承了CSPoint所有成員 新增了數(shù)據(jù)成員r 方法Set,舊款錄像機(jī)與舊款電視機(jī)相連舊款錄像機(jī)也可與新款電視機(jī)相連電視的音頻/視頻輸入輸出接口基本不變對象的對外接口穩(wěn)定對象在各自發(fā)展的同時(shí),還可以進(jìn)行交互。,(續(xù)),我的對外“接口”穩(wěn)定,,,同一操作作用于不同的類的對象,將產(chǎn)生不

7、同的執(zhí)行結(jié)果,即不同類的對象收到相同的消息時(shí),得到不同的結(jié)果。,面向?qū)ο蟮奶攸c(diǎn)—多態(tài),喵,汪,多態(tài)(2),開始講課,開始聽課,,,class 類名 [:基類]{數(shù)據(jù)成員的說明屬性的定義方法的定義事件的定義},6.2類的定義,默認(rèn)(省略)時(shí),為internal,只能在當(dāng)前項(xiàng)目中使用;若為public則可在其他項(xiàng)目中使用,放在命名空間(頂級類)創(chuàng)建類文件(頂級類),在哪里定義類?(1),,在類Program中

8、定義(嵌套類),在哪里定義類?(2),,數(shù)據(jù)成員(字段):在類中存儲信息的成員,“轎車”類的數(shù)據(jù)成員,顏色,排量,出廠日期,類型,字段名稱,class Car{ Private string color; Private float displacement; Private Datetime releasedate;},訪問修飾符,成員聲明的可選部分指明程序的其他部分如何訪問成員,成員的

9、訪問修飾符,手機(jī),公用電話,,,,,,設(shè)計(jì)“方法”用于表達(dá)對象的動(dòng)作。,“轎車”類的方法,動(dòng)作:行駛,Class Car{……public void Run(){Console.WriteLine(“Running now.”);}},訪問修飾符,返回值類型,方法名,形式參數(shù)列表,方法實(shí)例1:mymove()方法實(shí)例2:printa(),6.2.2 方法,[訪問修飾符] 返回值類型 方法名([形式

10、參數(shù)列表]) {方法體 },返回結(jié)果的數(shù)據(jù)類型,調(diào)用方法所需的參數(shù)及每個(gè)參數(shù)的數(shù)據(jù)類型,無返回值,返回值類型為void,可省略return語句;有返回值,返回值類型不為void,方法中必須有return語句,方法體中使用return語句返回函數(shù)值:return 表達(dá)式; 或 return(表達(dá)式); 或 return;//可在無返回值時(shí)使用,,參數(shù)與返回值

11、,方法,參數(shù)1,參數(shù)2,返回值,,,,形參列表位于方法名后的括號內(nèi),指明調(diào)用該方法所需參數(shù)及每個(gè)參數(shù)的數(shù)據(jù)類型多個(gè)參數(shù)間用逗號分隔無參數(shù)時(shí),括號不能省略public void Run(string road){Console.WriteLine(“我在”+road+”上行駛”);},形式參數(shù)(形參),調(diào)用指定對象的方法:對象.方法名([實(shí)在參數(shù)表])方法調(diào)用時(shí):按照實(shí)在參數(shù)(實(shí)參)的順序,依次將實(shí)參傳遞給對應(yīng)的

12、形參,二者的數(shù)據(jù)類型保持一致執(zhí)行方法中的語句,在遇到return語句時(shí),或者執(zhí)行完所有語句后,返回調(diào)用此方法的程序代碼段,同時(shí)返回一個(gè)值。,方法的調(diào)用,Public double sin(double x) { sx=…x.. ; return sx; } static void Main(string[] args) { y=sin(3.14/2); Console.Wr

13、ite (“結(jié)果為”+y); },形參,實(shí)參,class Myclass{ public int Sum(int x, int y) { return x + y; } public float Avg(float input1, float input2) { return (input1 + input2) / 2.0F; }},例 方法的調(diào)用,st

14、atic void Main(string[] args){ Myclass myC = new Myclass(); int z = 8; Console.WriteLine("Sum:{0} and {1} is {2}", 4, z, myC.Sum(4, z)); Console.WriteLine("Avg:{0} and {1} is {2}",4,z

15、,myC .Avg (4,z));},形參,實(shí)參,例6.4 方法的調(diào)用,static void Main(string[] args) { CSPoint1 p1 = new CSPoint1(); CSPoint1 p2 = new CSPoint1(); p1.SetValue(0, 0); p2.SetValue(1, 1); double s

16、= p1.Distance(p2); Console.WriteLine(s); Console.ReadKey(); },class CSPoint1{ private double x; private double y; public void SetValue(int a, int b) { x = a

17、; y = b; } public double Distance(CSPoint1 p) { double s = Math.Sqrt((x - p.x) * (x - p.x) + (y - p.y) * (x - p.y)); return s; }},調(diào)用方法時(shí)(通過參數(shù))將數(shù)據(jù)傳遞給被調(diào)用方法值形參:參數(shù)聲明

18、時(shí)無修飾符引用形參:用ref修飾符說明輸出形參:用out修飾符說明形參數(shù)組:用params修飾符說明,參數(shù)傳遞,car1.Run(“S20高速”);,road,“S20高速”,public void Run(string road),無修飾符按值傳遞過程中,實(shí)參和形參各自占用不同的內(nèi)存空間只把實(shí)參的值復(fù)制給對應(yīng)的形參執(zhí)行期間,形參的值改變對實(shí)參無任何影響例6.5,值形參,,例6.5,class Test { pu

19、blic static void swap(int x, int y) { int temp; temp = x; x = y; y = temp; } },static void Main(string[] args){ int k = 3; int l = 4; Test.swap(k, l); Console.WriteLine(

20、"k = {0},l = {1}", k, l); Console.Read(); },ref修飾符值傳遞時(shí),實(shí)參與形參使用的是相同的內(nèi)存單元在執(zhí)行期間,若形參的值發(fā)生變化,實(shí)參的值也會發(fā)生相同的變化引用形參實(shí)質(zhì)上是對應(yīng)實(shí)參的別名,他們相當(dāng)于同一個(gè)變量或?qū)ο螽?dāng)形參是引用形參時(shí),定義和調(diào)用時(shí)都必須使用ref關(guān)鍵字。例6.6,引用形參,,例6.6,class Test { public

21、static void swap(ref int x, ref int y) { int temp; temp = x; x = y; y = temp; } },static void Main(string[] args){ int k = 3; int l = 4; Test.swap(ref k,

22、ref l); Console.WriteLine("k = {0},l = {1}", k, l); Console.Read(); },,開始調(diào)用時(shí):,3,k,x,4,l,y,,4,k,x,3,l,y,結(jié)束調(diào)用時(shí):,out修飾符主要用于將數(shù)據(jù)從被調(diào)用函數(shù)傳遞到調(diào)用函數(shù)。定義和調(diào)用時(shí)都必須使用out關(guān)鍵字。,輸出形參,class Test{ public static v

23、oid arith(int x, int y, out int sum, out int difference) { sum = x + y; difference = x - y; }},static void Main(string[] args){ int k = 3, l = 4; int m, n; Test.arith(k, l, out m, ou

24、t n); Console.WriteLine("m = {0},n = {1}", m, n); Console.Read();},m=7,n=-1,屬性的定義格式訪問修飾符同數(shù)據(jù)成員的5種修飾符根據(jù)get和set訪問器是否存在,屬性分為:,[訪問修飾符] 類型 屬性名{[ get{get訪問器體}][ set{set訪問器體}]},讀寫屬性:包含get和set訪問器的屬

25、性只讀屬性:只有g(shù)et訪問器的屬性只寫屬性:只有set訪問器的屬性,get訪問器:定義屬性的讀操作!相當(dāng)于一個(gè)具有返回值的無參數(shù)方法,需要有return語句返回屬性值,set訪問器:定義屬性的寫操作!相當(dāng)于一個(gè)只有一個(gè)參數(shù)并且返回值為void類型的方法,學(xué)生類屬性例6.9,,class Car{private string color1;private float displacement1; private Date

26、time releasedate;public string Color{get {return color1;}set {color1=value;}}public string Displacement{get {return displacement1};set {displacement1 =value};}},Value:表示對屬性進(jìn)行寫操作時(shí)提供的參數(shù)car1. Color

27、 =“red”;時(shí),value即“red”,屬性和字段的區(qū)別,既然可以聲明一個(gè)public字段以實(shí)現(xiàn)讀寫,為什么還要采用屬性?public字段完全放開,任何人都可以對它進(jìn)行讀寫而屬性控制靈活,若只提供get方法則只支持讀;只提供set方法則只支持寫;都提供則支持讀寫。,屬性與字段的區(qū)別,1.屬性比字段讀寫提供更多的控制,如Car類的releasedate字段,一旦出廠便已確定,我們希望它只讀而不能修改。所以把releasedat

28、e字段設(shè)為private,而提供一個(gè)只讀的ReleaseDate屬性,class Car{……public DateTime ReleaseDate{get {return releasedate;}}……},例如,希望為Car類提供一個(gè)Age(使用年份)屬性,而且隨著時(shí)間發(fā)展,這個(gè)屬性會不斷變化而更新。年份=當(dāng)前日期-出廠日期提供Age屬性:屬性的讀操作中包含了計(jì)算的車齡的操

29、作。且車齡只讀,不能人為設(shè)置。,續(xù),2.屬性擁有一些方法的特征,讓它達(dá)到直接讀寫字段無法達(dá)到的效果,public TimeSpan Age{get {return(DateTime.today-ReleaseDate);}},創(chuàng)建對象如Car car1 = new Car();,6.2.5 對象,類名 對象名 = new 類名([參數(shù)表]);,Car car1;,Car1=new Car();,,car

30、1,構(gòu)造函數(shù)的作用:對象初始化的專用函數(shù) Font f1 = new Font("黑體", 20); Font f2 = new Font("黑體", 20,FontStyle.Bold);構(gòu)造函數(shù)的特點(diǎn):1)構(gòu)造函數(shù)名:構(gòu)造函數(shù)的名稱與類名相同 ,并且不能指定函數(shù)類型(也不能使用void)2) 可以重載:可以定義多個(gè)構(gòu)造函數(shù)總要有不同的地方:或參數(shù)個(gè)數(shù)不同,或參數(shù)類型不同的3)構(gòu)

31、造函數(shù)調(diào)用:創(chuàng)建對象時(shí)系統(tǒng)自動(dòng)調(diào)用,程序中不能直接調(diào)用。,新車出廠的時(shí)候,通過構(gòu)造函數(shù)來初始化其顏色、排量、出廠日期。class Car{…… public Car() //構(gòu)造函數(shù) {color=“gray”;//設(shè)置新Car對象的顏色displacement=2.0;//設(shè)置排量Releasedate=DateTime.today;//設(shè)置出廠日期 }},構(gòu)造函數(shù)不設(shè)返回值可以編寫有參數(shù)

32、的構(gòu)造函數(shù),讓它根據(jù)參數(shù)來初始化類的字段構(gòu)造函數(shù)在創(chuàng)建類的對象時(shí),通過new來調(diào)用,構(gòu)造函數(shù)(續(xù)),public Car() //無參數(shù)的構(gòu)造函數(shù) {color=“gray”;//設(shè)置新Car對象的顏色displacement=2.0;//設(shè)置排量Releasedate=DateTime.today;//設(shè)置出廠日期 }public Car(string Color,float Diaplac

33、ement) //有參數(shù)的構(gòu)造函數(shù) {color=Color;//設(shè)置新Car對象的顏色displacement= Diaplacement;//設(shè)置排量Releasedate=DateTime.today;//設(shè)置出廠日期 },Car car1 = new Car(); //調(diào)用無參數(shù)的構(gòu)造函數(shù)Car car2 = new Car(“red”,”2.4”) //調(diào)用有參數(shù)的構(gòu)造函數(shù),car1:gray,2

34、.0Car2:red,2.4,應(yīng)用例6.5所完成的Student類,當(dāng)選擇“數(shù)據(jù)賦予對象”按鈕時(shí),若成績小于60分則用MessageBox提示“成績不及格”;當(dāng)選擇“輸出對象數(shù)據(jù)”按鈕時(shí),用MessageBox輸出各屬性的值。,例6.11 創(chuàng)建并訪問對象,,例6.12 通過代碼在窗體上生成文本框,構(gòu)造函數(shù)的作用:對象初始化的專用函數(shù)構(gòu)造函數(shù)的特點(diǎn):1)構(gòu)造函數(shù)名:構(gòu)造函數(shù)的名稱與類名相同 ,并且不能指定函數(shù)類型(也不能使用voi

35、d)2) 可以重載:可以定義多個(gè)構(gòu)造函數(shù)總要有不同的地方:或參數(shù)個(gè)數(shù)不同,或參數(shù)類型不同的3)構(gòu)造函數(shù)調(diào)用:創(chuàng)建對象時(shí)系統(tǒng)自動(dòng)調(diào)用,程序中不能直接調(diào)用。,6.2.6 構(gòu)造函數(shù),public Form1(){InitializeComponent();},新車出廠的時(shí)候,通過構(gòu)造函數(shù)來初始化其顏色、排量、出廠日期。class Car{…… public Car() //構(gòu)造函數(shù) {color=“g

36、ray”;//設(shè)置新Car對象的顏色displacement=2.0;//設(shè)置排量Releasedate=DateTime.today;//設(shè)置出廠日期 }},構(gòu)造函數(shù)不返回值可以編寫有參數(shù)的構(gòu)造函數(shù),讓它根據(jù)參數(shù)來初始化類的字段構(gòu)造函數(shù)在創(chuàng)建類的對象時(shí),通過new來調(diào)用,構(gòu)造函數(shù)(續(xù)),public Car() //無參數(shù)的構(gòu)造函數(shù) {color=“gray”;//設(shè)置新Car對象的顏色

37、displacement=2.0;//設(shè)置排量Releasedate=DateTime.today;//設(shè)置出廠日期 }public Car(string Color,float Diaplacement) //有參數(shù)的構(gòu)造函數(shù) {color=Color;//設(shè)置新Car對象的顏色displacement= Diaplacement;//設(shè)置排量Releasedate=DateTime.today;/

38、/設(shè)置出廠日期 },Car car1 = new Car(); //調(diào)用無參數(shù)的構(gòu)造函數(shù)Car car2 = new Car(“red”,”2.4”) //調(diào)用有參數(shù)的構(gòu)造函數(shù),car1:gray,2.0Car2:red,2.4,后一代“繼承”前一代的功能但是在功能上又有所發(fā)展舊電視派生出新電視新電視繼承了舊電視,繼承和派生,派生,派生,繼承,繼承,基類(父類)?派生類(子類),定時(shí)開機(jī)自動(dòng)搜索,6.3.1 基類和派

39、生類,定義:在已有類的基礎(chǔ)上構(gòu)造新的類, 新類繼承了原有類的數(shù)據(jù)成員、屬性、方法和事件 原有的類稱為基類,新類稱為派生類,,面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承性,基類,派生類,派生繼承,,派生類,基類,派生類是基類的一個(gè)子集,注意:箭頭方向,Mammal哺乳動(dòng)物,Horse馬,派生類,基類,,Whale鯨魚,Mammal哺乳動(dòng)物,哺乳動(dòng)物的繼承關(guān)系,,,,class 派生類名 : 基類名{ //…

40、},System.Object類是所有類的基類,所有類都隱式派生于Object類。C#編譯器會悄悄將Mammal類寫為以下代碼class Mammal : Object{ //…}C#中定義的所有類會自動(dòng)繼承Object類的特性,如ToString()方法,,,class Mammal { public void Breath()//呼吸 { …

41、 } public void SuckleYoung() //哺乳 { … }},class Whale: Mammal { public void Swim ()//游泳 {… } },class Horse : Mammal { public void Tro

42、t() //小跑 {… } },派生類的對象可以作為基類的對象處理定義的派生類對象可以訪問基類的公用成員允許將派生類對象賦值給基類對象例,派生類的對象,class Mammal { public string name; public void Breath() { Console.WriteLine(name

43、 + "正在呼吸"); } public void SuckleYoung() { Console.WriteLine(name + "正在哺乳"); }},class Horse : Mammal{ public void Trot() { this.

44、Breath();//調(diào)用父類的public方法 Console.WriteLine(name + "正在奔跑");//調(diào)用父類的public數(shù)據(jù)成員 }},static void Main(string[] args){ Mammal mammal = new Mammal(); mammal.name=“mammal”; mammal.Bre

45、ath(); mammal.SuckleYoung(); Horse horse = new Horse(); horse.name=“horse”; horse.SuckleYoung(); horse.Trot(); },子類調(diào)用父類的非私有成員,在建立派生類的實(shí)例對象時(shí),先調(diào)用基類的構(gòu)造函數(shù),再執(zhí)行派生類的構(gòu)造函數(shù)。例,無參數(shù)構(gòu)造函數(shù),class Mammal{ p

46、ublic Mammal() { Console.WriteLine("我是一只哺乳動(dòng)物"); } //…},class Horse : Mammal{ public Horse() { Console.WriteLine("我是一匹馬"); } //… },static void Main(str

47、ing[] args){ Horse horse = new Horse();},public 派生類名(派生類構(gòu)造函數(shù)總參數(shù)表) : base(基類構(gòu)造函數(shù)參數(shù)表){ 派生類數(shù)據(jù)成員初始化}例,有參數(shù)構(gòu)造函數(shù),用base關(guān)鍵字來指定調(diào)用一個(gè)基類的構(gòu)造函數(shù)。 先調(diào)用基類的有參數(shù)構(gòu)造函數(shù); 然后調(diào)用派生類的有參數(shù)構(gòu)造函數(shù),,,class Mammal { private string n

48、ame; public Mammal() { Console.WriteLine("我是一只哺乳動(dòng)物"); } public Mammal(string mammalName) { name = mammalName; Console.WriteLine(mammalName +"是一只哺乳動(dòng)物");

49、 } },class Horse : Mammal{ public Horse(string name): base(name) { Console.WriteLine(name+"是一匹馬"); }//…},static void Main(string[] args){ Mammal mammal = new Mammal("mammal&quo

50、t;); Horse horse = new Horse("horse"); Console.ReadLine();},,,,委托是一個(gè)對象,有了委托,我們可以把方法本身當(dāng)作參數(shù)來傳遞它引用類實(shí)例或者該類的實(shí)例方法,或靜態(tài)方法靜態(tài)方法:Static關(guān)鍵字說明;調(diào)用時(shí)用類名直接調(diào)用;靜態(tài)方法只能訪問類的靜態(tài)成員,而不能訪問實(shí)例成員例,委托,委托的定義:使用delegate關(guān)鍵字publi

51、c delegate string Mydelegate (string arg);,,,在生成一個(gè)委托的實(shí)例時(shí),必須用一個(gè)方法來實(shí)例化,而這個(gè)方法的參數(shù)和返回值必須與委托的一致。,程序中的m1,m2,m3是3個(gè)Mydelegate類型的引用。它們分別指向了3個(gè)方法,使用委托的時(shí)候,語法就和調(diào)用一個(gè)方法一樣。委托會去調(diào)用它所指向的那個(gè)方法,從而得到與直接調(diào)用方法一致的結(jié)果。,將前面的程序稍作修改,加入一個(gè)ProcessAndPrint

52、方法由于有了委托機(jī)制,只需把操作寫成一個(gè)方法,然后通過委托,交給ProcessAndPrint來使用。把方法作為參數(shù)傳遞的做法稱為“回調(diào)”,改進(jìn),接受一個(gè)委托和一個(gè)字符串作為參數(shù),在用委托處理了字符串以后,把它輸出到屏幕,c.ProcessAndPrint(m1, s);c.ProcessAndPrint(m2, s);c.ProcessAndPrint(m3, s);,例 6.2 定義一個(gè)學(xué)生類Student,

53、數(shù)據(jù)成員,方法,學(xué)號,姓名,成績,設(shè)置數(shù)據(jù)成員值,輸出數(shù)據(jù)成員值,,,私有,公有,事件:類/對象向其他類/對象通知發(fā)生的相關(guān)事情Form1_Click事件是如何定義的?Form1_Click事件應(yīng)用例6.10 設(shè)置學(xué)生的成績,當(dāng)<60時(shí)引發(fā)事件 引發(fā)(或發(fā)送)事件的類:“發(fā)行者”(生產(chǎn)者) 處理(或接收)事件的類:“訂戶”(消費(fèi)者),自行定義類的事件,在類外聲明委托 public delegate void

54、 委托;在類定義中: 用public Event 委托 事件名 語句聲明事件 合適地方引發(fā) 事件名() 語句引發(fā)事件在對象實(shí)例化時(shí): 對象.事件名+=new 委托(處理方法)添加事件 處理方法代碼編寫,嘀嘀,委托除了用于“回調(diào)”,最大的用處是支持事件機(jī)制,事件,類Form1在構(gòu)造函數(shù)中,為事件Click添加了一個(gè)處理程序Form1_C ()?!?=“ 作為委托串聯(lián)運(yùn)算符,把一個(gè)方法指派給一個(gè)委托,使得調(diào)

55、用這個(gè)委托就相當(dāng)于調(diào)用這個(gè)方法。,嘀嘀,一個(gè)事件就可以同時(shí)擁有多個(gè)處理程序,一個(gè)委托可以被指派給多個(gè)方法,public Form1(){ this.Click += new EventHandler(this.Form_Click); this.Click += new EventHandler(this.Form_Click2);}private void Form_Click(object sender, Ev

56、entArgs e){ MessageBox.Show("您在窗體上單擊了鼠標(biāo)");}private void Form_Click2(object sender, EventArgs e){ MessageBox.Show("Form_Click2的響應(yīng)");},,構(gòu)造函數(shù)為對象的Click事件指定了兩個(gè)事件處理程序,兩個(gè)方法的調(diào)用順序就是它們被指派給Click事件的順

57、序。,,移除委托,C#允許使用+=運(yùn)算符來進(jìn)行委托串聯(lián);也允許使用-=運(yùn)算符來移除委托。,public Form1(){ EventHandler eh = new EventHandler(this.Form_Click); this.Click += eh; this.Click += new EventHandler(this.Form_Click2); this.Click -= eh

58、;},聲明一個(gè)委托實(shí)例(定義一個(gè)委托類型),在類中聲明這個(gè)事件(即產(chǎn)生委托的一個(gè)實(shí)例),在事件消費(fèi)者處:,在命名空間內(nèi):,在事件生產(chǎn)者處:,編寫執(zhí)行事件的代碼,public delegate void FailHandler() ;,在合適的地方加入引發(fā)事件的代碼,public event FailHandler Fail ;,public int 成績{ get { return Score; } set

59、 { Score=value; if(Score<60)Fail(); } },訂閱或取消事件,s.Fail += new FailHandler(Fail_Handler);,Public static void Fail_Handler(){ Console.Write(“不及格”);},,委托名,,事件名,,關(guān)鍵字:委托,聲明一個(gè)委托的實(shí)例,命名為FailHandler,,,訂閱事件,,訂閱后,

60、只要事件Fail被觸發(fā),就會調(diào)用Fail_Handler,,,(1)創(chuàng)建應(yīng)用程序,添加類Student,class Student { private string No; // 學(xué)號 private string Name; // 姓名 private int Score; //

61、 成績 public void SetValue(string a, string b, int c) // SetValue方法用于設(shè)置各數(shù)據(jù)成員的值 { No = a; Name = b; Score = c; } public void Print() // Print方法用于輸出各數(shù)據(jù)成員的值

62、 { Console.WriteLine(No); Console.WriteLine(Name); Console.WriteLine(Score); } public string 學(xué)號// 定義學(xué)號屬性 { get { return No; } set { No = value; } }

63、 public string 姓名// 定義姓名屬性 { get { return Name; } set { Name = value; } } },(2)聲明事件處理委托,namespace T6._10{ public delegate void FailHandler(); //其他語句},(3)在類Student的定義中

64、 聲明事件類型 編寫引發(fā)事件的代碼,class Student{ //。。。。。。其他語句 public event FailHandler Fail; //聲明事件Fail為FailHandler類型 public int 成績// 定義成績屬性 { get { return Score; } set

65、 { Score = value; if (Score < 60) Fail(); // 當(dāng)成績小于60分時(shí)引發(fā)Fail事件 } } },(4)在類Program中 訂閱事件 編寫執(zhí)行事件的代碼,class Program { static void

66、Main(string[] args) { Student s = new Student(); s.Fail += new FailHandler(Fail_Handler); s.學(xué)號 = "9803"; s.姓名 = "王濤"; s.成績 = 56;

67、 } public static void Fail_Handler() { Console.WriteLine("不及格"); } },事件的定義和使用,引發(fā)(或發(fā)送)事件的類:“發(fā)行者”(生產(chǎn)者) 處理(或接收)事件的類:“訂戶”(消費(fèi)者),,,委托名,,事件名,,關(guān)鍵字:委托,聲明一個(gè)委托的實(shí)例,命名為FailHand

68、ler,,,訂閱事件,,訂閱后,只要事件Fail被觸發(fā),F(xiàn)ail_Handler事件處理方法就會被調(diào)用,事件的本質(zhì)是委托在類中加入事件:定義一個(gè)委托類型在類中加入這個(gè)委托的一個(gè)實(shí)例(即事件)在合適的地方加入對這個(gè)委托的調(diào)用(觸發(fā)事件),,例6.15 定義一個(gè)時(shí)間類Date,包含年、月、日三個(gè)數(shù)據(jù)成員,以及一個(gè)求第二天日期的方法和輸出日期的方法。,6.4 綜合應(yīng)用,例6.16 定義一個(gè)汽車類vehicle,其數(shù)據(jù)成員有車輪個(gè)數(shù)

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論