生活随笔
收集整理的這篇文章主要介紹了
面向对象基础-委托与事件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先舉一個實例:
創建一個控制臺程序,需求是:有一只貓Tom,有兩只老鼠Jerry和Jack,Tom只叫一聲“喵,我是Tom”,兩只老鼠就說“老貓來了,快跑”,我們來分析一下:
我們需要Cat和Mouse類兩個類,當Cat的Shout方法觸發的時候,Mouse就執行Run方法,不過這里如何讓Shout觸發式,通知兩只老鼠呢?顯然老貓不會通知老鼠“我來了,你們快跑”。
所以,我們在Cat類中,不應該關聯Mouse類的。這個時候,委托事件就是最好的處理方法了。
委托是對函數的封裝,可以當作方法的特征指定一個名稱。而事件則是委托的一種特殊形式,當發生有意義的事件時,時間對象處理通知過程。
委托是一種引用方法的類型。一旦為委托分配了方法,委托將與該方法具有完全相同的行為,委托用關鍵字delegate來聲明,而事件就是說在發生其他類或者對象關注事件時,類或對象可通過事件通知他們,事件的關鍵字 用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(
"老貓來了,{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)的含義是實例化一個委托,而委托的實例其實就是Mouse的Run方法。而“cat.CahShout += ”表示
cat.add_CatShout(
new Cat2.CatShoutEventHandler(mouse1.Run))的意思。運行的結果:
我們平時在點擊一個按鈕的時候,通常看到這樣子的東西:
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}來了,{1}快跑!", args.Name, name);
32: }
33: }
?
Main函數不變。這個時候的結果是:
轉載于:https://www.cnblogs.com/chenamo5776/archive/2011/11/13/2247177.html
總結
以上是生活随笔為你收集整理的面向对象基础-委托与事件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。