生活随笔
收集整理的這篇文章主要介紹了
面向对象基础-委托与事件
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先舉一個(gè)實(shí)例:
創(chuàng)建一個(gè)控制臺(tái)程序,需求是:有一只貓Tom,有兩只老鼠Jerry和Jack,Tom只叫一聲“喵,我是Tom”,兩只老鼠就說(shuō)“老貓來(lái)了,快跑”,我們來(lái)分析一下:
我們需要Cat和Mouse類兩個(gè)類,當(dāng)Cat的Shout方法觸發(fā)的時(shí)候,Mouse就執(zhí)行Run方法,不過(guò)這里如何讓Shout觸發(fā)式,通知兩只老鼠呢?顯然老貓不會(huì)通知老鼠“我來(lái)了,你們快跑”。
所以,我們?cè)贑at類中,不應(yīng)該關(guān)聯(lián)Mouse類的。這個(gè)時(shí)候,委托事件就是最好的處理方法了。
委托是對(duì)函數(shù)的封裝,可以當(dāng)作方法的特征指定一個(gè)名稱。而事件則是委托的一種特殊形式,當(dāng)發(fā)生有意義的事件時(shí),時(shí)間對(duì)象處理通知過(guò)程。
委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為,委托用關(guān)鍵字delegate來(lái)聲明,而事件就是說(shuō)在發(fā)生其他類或者對(duì)象關(guān)注事件時(shí),類或?qū)ο罂赏ㄟ^(guò)事件通知他們,事件的關(guān)鍵字 用event聲明。
1: class Cat2
2: {
3: private string name;
4: public Cat2(
string name)
5: {
6: this.name = name;
7: }
8: public delegate void CatShoutEventHandler();
9: public event CatShoutEventHandler CatShout;
10: public void Shout()
11: {
12: Console.Write(
"喵,我是{0}.", name);
13: if (CatShout !=
null)
14: CatShout();
15: }
16: }
17: ?
18: class Mouse
19: {
20: private string name;
21: public Mouse(
string name)
22: {
23: this.name = name;
24: }
25: public void Run()
26: {
27: Console.WriteLine(
"老貓來(lái)了,{0}快跑!", name);
28: }
29: }
30: ?
31: static void Main(
string[] args)
32: {
33: Cat2 cat =
new Cat2(
"Tom");
34: Mouse mouse1 =
new Mouse(
"Jerry");
35: Mouse mouse2 =
new Mouse(
"Jace");
36: cat.CatShout +=
new Cat2.CatShoutEventHandler(mouse1.Run);
37: cat.CatShout +=
new Cat2.CatShoutEventHandler(mouse2.Run);
38: cat.Shout();
39: Console.Read();
40: }
?
new Cat2.CatShoutEventHandler(mouse1.Run)的含義是實(shí)例化一個(gè)委托,而委托的實(shí)例其實(shí)就是Mouse的Run方法。而“cat.CahShout += ”表示
cat.add_CatShout(
new Cat2.CatShoutEventHandler(mouse1.Run))的意思。運(yùn)行的結(jié)果:
我們平時(shí)在點(diǎn)擊一個(gè)按鈕的時(shí)候,通常看到這樣子的東西:
private void button5_Click(
object sender, EventArgs e)
這里的sender和e有什么用呢?
我們首先修改一下上面的例子
1: class Cat2
2: {
3: private string name;
4: public Cat2(
string name)
5: {
6: this.name = name;
7: }
8: public delegate void CatShoutEventhandler(
object sender, CatShoutEventArgs args);
9: public event CatShoutEventhandler CatShout;
10: public void Shout()
11: {
12: Console.Write(
"喵,我是{0}.", name);
13: if (CatShout !=
null)
14: {
15: CatShoutEventArgs e =
new CatShoutEventArgs();
16: e.Name =
this.name;
17: CatShout(
this, e);
18: }
19: }
20: }
21: ?
22: class Mouse
23: {
24: private string name;
25: public Mouse(
string name)
26: {
27: this.name = name;
28: }
29: public void Run(
object sender, CatShoutEventArgs args)
30: {
31: Console.WriteLine(
"老貓{0}來(lái)了,{1}快跑!", args.Name, name);
32: }
33: }
?
Main函數(shù)不變。這個(gè)時(shí)候的結(jié)果是:
轉(zhuǎn)載于:https://www.cnblogs.com/chenamo5776/archive/2011/11/13/2247177.html
總結(jié)
以上是生活随笔為你收集整理的面向对象基础-委托与事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。