接口包含内容概述2——委托与事件之惑
前言:
?? 上篇博文《接口包含內(nèi)容概述1——接口相關(guān)概述及接口中屬性的實現(xiàn)》最后留有一疑問:一個接口為什么可以包含一個事件,卻不能包含一個委托呢? 在這里要想對這個問題解答,首先必須搞清楚委托和事件這兩個容易使人眩暈的問題:
?
委托概述:
?? 在 C 語言 的眾多種類型指針中,有一種叫做“函數(shù)指針”,即是指函數(shù)的入口地址。在 C# 中委托的概念與其相類似。而與C 語言中函數(shù)指針不同的是,.NET 中的委托是類型安全的。
?
委托的使用:
? ?? 同使用一個類相類似,首先定義要使用的委托,這里規(guī)定了委托所代表的哪種類型的方法; 其次創(chuàng)建該委托的一個或多個實例。這里舉一示范代碼:
//CopyRight:?http://www.cnblogs.com/yangmingming
//Notes:?為簡便,將委托的定義,和驗證代碼放于一起
namespace?DelegateDemo
{
????class?Program
????{
????????//委托的定義,制定對應(yīng)方法的類型
????????public?delegate?int?DelegateShowInt(int?i);
????????public?static?int?ShowData(int?i)
????????{
????????????return?i?+?1;
????????}
????????static?void?Main(string[]?args)
????????{
????????????DelegateShowInt?showInt?=?new?DelegateShowInt(ShowData);
????????????Console.WriteLine("The Result is {0}",?showInt(1));
????????}
????}
}
最后調(diào)試結(jié)果為:
?
?上例可見一般情況下,委托的應(yīng)用,即在對應(yīng)一個方法使用委托的情況下。
注意:
?對于式:DelegateShowInt?showInt?=?new?DelegateShowInt(ShowData) 可以認為是所有委托都有的“構(gòu)造函數(shù)”形式——其參數(shù)是函數(shù)引用。
?
多播委托:
前面例子中是最為簡單、常用的一種形式(一個委托實例,調(diào)用一個方法)。因為我們可以實例化一個或多個某種委托的實例,另一方面,我們也可以讓一個委托調(diào)用多個方法,這里稱作多播委托。
//CopyRight:?http://www.cnblogs.com/yangmingming
//Notes:?為簡便,將委托的定義,和驗證代碼放于一起
namespace?DelegateDemo
{
????class?Program
????{
????????//定義委托,注意返回類型為?:void
????????public?delegate?void??DelegateShowInt(int?i);
????????public?static??void?ShowData(int?i)
????????{
????????????Console.WriteLine("ShowData?is?{0}",?i);
????????}
????????public?static?void??ShowData2(int?i)
????????{
????????????Console.WriteLine?("ShowData2?is?{0}",i+1);
????????}
????????static?void?Main(string[]?args)
????????{
????????????//多播委托的使用方法:+=
????????????DelegateShowInt?showInt?=?new?DelegateShowInt(ShowData);
????????????showInt?+=new?DelegateShowInt(?ShowData2);
????????????showInt(1);
????????????showInt(2);
????????}
????}
}
?而對應(yīng)的調(diào)試結(jié)果為:
?
?
?通過實例,可見我們對委托對象,實現(xiàn)了多個方法的綁定。
注意: 之所以要求多播委托的返回類型為void,是因為如果有返回值,將沒有意義,起到作用的只有最后一個被調(diào)用的函數(shù)而已!
?
事件概述:
?? 有了前述對委托的講述,為這里講解事件做好了鋪墊。事件,其在Windows Form中得到極大應(yīng)用,這里舉一最常見的點擊按鈕,觸發(fā)事件的例子。
?2?????????{
?3?????????????this.buttonOne?=?new?System.Windows.Forms.Button();
?4?????????????this.SuspendLayout();
?5?????????????//?
?6?????????????//?buttonOne
?7?????????????//?
?8?????????????this.buttonOne.Location?=?new?System.Drawing.Point(241,?37);
?9?????????????this.buttonOne.Name?=?"buttonOne";
10?????????????this.buttonOne.Size?=?new?System.Drawing.Size(75,?23);
11?????????????this.buttonOne.TabIndex?=?0;
12?????????????this.buttonOne.Text?=?"button";
13?????????????this.buttonOne.UseVisualStyleBackColor?=?true;
14?????????????this.buttonOne.Click?+=?new?System.EventHandler(this.button_Click);
15?????????????//?
16?????????????//?Form1
17?????????????//?
18?????????????this.AutoScaleDimensions?=?new?System.Drawing.SizeF(6F,?12F);
19?????????????this.AutoScaleMode?=?System.Windows.Forms.AutoScaleMode.Font;
20?????????????this.ClientSize?=?new?System.Drawing.Size(292,?266);
21?????????????this.Controls.Add(this.buttonOne);
22?????????????this.Name?=?"Form1";
23?????????????this.Text?=?"Form1";
24?????????????this.ResumeLayout(false);
25?
26?????????}
可見在14行,對對象buttonOne的事件Click賦予了委托,該委托指定了形式:
????????{
????????}
?對應(yīng)類型的參數(shù)含有object和EventArgs,并且返回為void形式。這樣事件就與委托相聯(lián)系上。
同樣可以實現(xiàn)不同對象的事件,對應(yīng)同一委托情形:
?this.buttonOne.Click?+=?new?System.EventHandler(this.button_Click);????????????this.buttonTwo.Click?+=?new?System.EventHandler(this.button_Click);
綜上可見:
1.委托,作為一種特殊的類型,雷同于定義一個類(實際上,后臺即是將其作為類處理) ;
2.事件,規(guī)范了其類型(委托類型);
?
綜上之,之所以接口不能包含委托,而接口為什么可以包含事件呢?
因為委托是一種與類同等地位的特殊類型(類的實例是存儲數(shù)據(jù)的托管內(nèi)存空間,而委托則只有方法地址而已),故接口不能包含委托;事件從地位上不與類、接口同一層次,事件的獨特機制使得事件可以是一個接口的標準組成部分,只要繼承的類包含一個public事件成員;(看樣要想說明白,還要將事件講述更清楚些,呵呵~)
附:附加版
? ? 如上文所述,事件一般都是應(yīng)用在諸如Windows form這樣的事件驅(qū)動環(huán)境中。具體例子可見上述按鈕觸發(fā)事件自動生成的代碼。然而對事件而言,我們自己也可以定義事件的,見下例:
?
?1?//Description:?通過自定義事件,了解自定義事件使用方法?2?
?3?//CopyRight:?http://www.cnblogs.com/yangmingming
?4?
?5?//Notes:?為簡便,將自定義事件的定義,和驗證代碼放于一起
?6?
?7?
?8?namespace?SelfDefinitionEvent
?9?{
10?????//先定義一委托類型
11?????public?delegate?void?DelegateDog(?);
12?????
13?
14?????public?class?Dog
15?????{
16?????????//定義事件類型,其類型對應(yīng)于自定義委托類型
17?????????public?event?DelegateDog?EventDog;
18?????????private?string?name;
19?????????public?string?Name
20?????????{
21?????????????get?{?return?name;?}
22?????????????set?{?name?=?value;?}
23?????????}
24?????????public?void?Invoked()
25?????????{
26?????????????//使用事件方法:像使用其對應(yīng)方法一樣使用
27?????????????EventDog();
28?????????}
29?????}
30?????class?Program
31?????{
32?????????public?static?void?Response()
33?????????{
34?????????????Console.WriteLine("It?will?attack?human.");
35?????????}
36?????????static?void?Main(string[]?args)
37?????????{
38?????????????Dog?dog?=?new?Dog();
39?????????????dog.Name?=?"Jack";
40?????????????//對事件的操作,使之與對應(yīng)委托相關(guān)
41?????????????dog.EventDog?+=?new?DelegateDog(Response);
42?????????????dog.Invoked();
43?????????????
44?????????}
45?????}
46?}
47?
最后結(jié)果為:
?
? ?
?從上例,可以看到自定義事件的從定義、賦值、使用等個部分的方法,也可以加深對事件的了解。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangmingming/archive/2010/02/21/1670486.html
總結(jié)
以上是生活随笔為你收集整理的接口包含内容概述2——委托与事件之惑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果Mac OS X系统怎么查看硬件信息
- 下一篇: NAT类型