Delegate & Event<br />1<br />20/03/2011<br />
Table of Contents<br /><ul><li>Delegate
Definition of delegate
Working with delegates in C#
Multicast delegate
Problem & Solution for generic Sort method
Event
What is event
Event & delegate
Publishing & subscribing
Demo using event
Summary</li></ul>2<br />16/01/2011<br />
Definition of delegate<br /><ul><li>Class package some signature methods
Using in event-handling model of C#
Like C/C++ method pointers, but more specific
Type safe
Object- oriented mechanism
Delegates are classes
Can create instances of delegates
Delegates can refer one or more methods</li></ul>3<br />16/01/2011<br />
Definition of delegate<br /><ul><li>Delegates define a method signature
Return type
Sequence of parameter types
Any method has same signature can add to instance of delegate
Delegate instances have the list of method references
Using “+=” for adding method to instance
Using “-=” for removing method out of instance</li></ul>4<br />16/01/2011<br />
Working with delegates<br />Define a delegate in namespace or class<br />5<br />16/01/2011<br />public delegate void MyDel...
Working with delegates<br />Instance of delegate<br />6<br />16/01/2011<br />public delegate void MyDelegate1(int  x, int ...
Working with delegate<br />Instance of delegate<br />7<br />16/01/2011<br />public delegate string MyDelegate2(float f); <...
Working with delegate<br />Invoking delegates<br />8<br />16/01/2011<br />d1<br />int x = 5, y = 10;<br />d1(x, y);<br />d...
Invoking multiple delegate<br />Using only for delegates with no return value<br />9<br />16/01/2011<br />No return<br />c...
Invoking multiple delegate<br />10<br />16/01/2011<br />class  Test<br />{<br />        //…<br />        static void Main(...
11<br />16/01/2011<br />Demo 1<br />
Problem<br />12<br />16/01/2011<br />How to build the Sort method for array of objects of any data type?<br />Sort method<...
Problem<br />Survey<br />The objects are (primitive) data type such as: long, int, float, string…so easy to do!<br />In ot...
Solution<br />Objects have to define their order (Compare)<br />Using delegate to pass “compare method” into Sort method.<...
Solution<br />Define delegate CompareObj for Sort method<br />15<br />16/01/2011<br />Name of delegate type<br />public de...
Solution<br />16<br />16/01/2011<br />Delegate will refer to compare method of class<br />Definition of Sort method<br />p...
Solution<br />Class support Sort method required<br />Provide a Compare method (or more)<br />Method signature is same wit...
Solution<br />18<br />16/01/2011<br />        //…<br />        Person[] persons= new Person[4];<br />        persons[0] = ...
19<br />16/01/2011<br />Demo 2 <br />
20<br />16/01/2011<br />Event<br />
Event<br />Cơ chế thông điệp giữa các lớp hay các đối tượng<br />Có thể thông báo cho lớp khác biết được khi một lớp có ph...
Event<br />Trong môi trường giao diện GUIs (Graphical User Interfaces: GUIs):<br />Button đưa ra sự kiện “Click”, cho phép...
Event<br />Một lớp publish tập các event cho phép các lớp khác subscribe<br />Button là lớp publish đưa ra event: click <b...
Event & Delegate<br />Sự kiện trong C# được thực thi nhờ uỷ thác<br />Lớp publishing định nghĩa ủy thác<br />Những lớp sub...
Event & Delegate<br /><ul><li>Trìnhxửlýsựkiệntrong .NET Framework đượcmôtảnhưsau:
Trảvềgiátrị void
Thamsố 1:  nguồnphátsinhsựkiện, đâychínhlàđốitượng publisher
Thamsố 2: làđốitượngthuộclớpdẫnxuấttừEventArgs
Phảithựchiệntrìnhxửlýsựkiệntheođúngmẫutrên!</li></ul>25<br />16/01/2011<br />
Upcoming SlideShare
Loading in …5
×

P05 delegate & event 2009

761 views
603 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
761
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
17
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

P05 delegate & event 2009

  1. 1. Delegate & Event<br />1<br />20/03/2011<br />
  2. 2. Table of Contents<br /><ul><li>Delegate
  3. 3. Definition of delegate
  4. 4. Working with delegates in C#
  5. 5. Multicast delegate
  6. 6. Problem & Solution for generic Sort method
  7. 7. Event
  8. 8. What is event
  9. 9. Event & delegate
  10. 10. Publishing & subscribing
  11. 11. Demo using event
  12. 12. Summary</li></ul>2<br />16/01/2011<br />
  13. 13. Definition of delegate<br /><ul><li>Class package some signature methods
  14. 14. Using in event-handling model of C#
  15. 15. Like C/C++ method pointers, but more specific
  16. 16. Type safe
  17. 17. Object- oriented mechanism
  18. 18. Delegates are classes
  19. 19. Can create instances of delegates
  20. 20. Delegates can refer one or more methods</li></ul>3<br />16/01/2011<br />
  21. 21. Definition of delegate<br /><ul><li>Delegates define a method signature
  22. 22. Return type
  23. 23. Sequence of parameter types
  24. 24. Any method has same signature can add to instance of delegate
  25. 25. Delegate instances have the list of method references
  26. 26. Using “+=” for adding method to instance
  27. 27. Using “-=” for removing method out of instance</li></ul>4<br />16/01/2011<br />
  28. 28. Working with delegates<br />Define a delegate in namespace or class<br />5<br />16/01/2011<br />public delegate void MyDelegate1(int x, int y); <br />Delegate for methods: void ABC( int, int )<br />public delegate string MyDelegate2(float f); <br />Delegate for methods: string XYZ( float )<br />
  29. 29. Working with delegates<br />Instance of delegate<br />6<br />16/01/2011<br />public delegate void MyDelegate1(int x, int y); <br />class Test<br />{<br />public void Method1(int a, int b)<br />{<br /> // body of method<br />}<br />…<br />}<br />Test t = new Test();<br />MyDelegate1 d1 = new MyDelegate1( t.Method1 );<br />
  30. 30. Working with delegate<br />Instance of delegate<br />7<br />16/01/2011<br />public delegate string MyDelegate2(float f); <br />class Test<br />{<br />…<br />public static string Method2(float f)<br />{<br /> // body of method<br />}<br />}<br />MyDelegate2 d2 = new MyDelegate2( Test.Method2 );<br />
  31. 31. Working with delegate<br />Invoking delegates<br />8<br />16/01/2011<br />d1<br />int x = 5, y = 10;<br />d1(x, y);<br />d1(10, 20);<br />int y = 2;<br />d1(100, y);<br />d2<br />float f =0.5f;<br />string s = d2(f);<br />string s = d2(100);<br />
  32. 32. Invoking multiple delegate<br />Using only for delegates with no return value<br />9<br />16/01/2011<br />No return<br />class Test<br /> {<br /> public delegate voidMyDelegate3(int n1, int n2);<br /> static void Print(int x, int y)<br /> {<br />Console.WriteLine("x={0}, y={1}", x, y);<br /> }<br /> static void Sum(int a, int b)<br /> {<br />Console.WriteLine("Tong={0}", a + b);<br /> } <br /> // (cont)…<br />}<br />
  33. 33. Invoking multiple delegate<br />10<br />16/01/2011<br />class Test<br />{<br /> //…<br /> static void Main(string[] args)<br /> {<br /> MyDelegate3 md = new MyDelegate3(Print);<br />md+= new MyDelegate3(Sum);<br />md(5, 10);<br />md -= new MyDelegate3(Print);<br />md(50, 60);<br /> }<br />}<br />x=5, y=10<br />Tong=15<br />Tong=110<br />
  34. 34. 11<br />16/01/2011<br />Demo 1<br />
  35. 35. Problem<br />12<br />16/01/2011<br />How to build the Sort method for array of objects of any data type?<br />Sort method<br />
  36. 36. Problem<br />Survey<br />The objects are (primitive) data type such as: long, int, float, string…so easy to do!<br />In other case, object is complex data type, how to do?<br />13<br />16/01/2011<br />Which criteria for <br />comparing?<br />
  37. 37. Solution<br />Objects have to define their order (Compare)<br />Using delegate to pass “compare method” into Sort method.<br />14<br />16/01/2011<br />void Sort(object[] list, CompareObjcmp)<br />This delegate refers to Compare method of class which need to sort.<br />
  38. 38. Solution<br />Define delegate CompareObj for Sort method<br />15<br />16/01/2011<br />Name of delegate type<br />public delegate intCompareObj(object o1, object o2)<br />-1 : o1 “<“ o2<br /> 0 : o1 “=“ o2<br /> 1 : o1 “>” o2<br />Two objects passed<br />
  39. 39. Solution<br />16<br />16/01/2011<br />Delegate will refer to compare method of class<br />Definition of Sort method<br />public static void Sort(object[] objs, CompareObj cmp)<br />{<br /> for(int i=0; i < objs.Length-1;i++)<br /> for(int j=objs.Length-1; j>i;j--)<br /> if (cmp(objs[j],objs[j-1]) == -1)<br /> Swap( objs[j], objs[j-1] );<br />}<br />Invoking delegate (refer Compare method of class)<br />
  40. 40. Solution<br />Class support Sort method required<br />Provide a Compare method (or more)<br />Method signature is same with the delegate<br />17<br />16/01/2011<br />class Person{<br /> private string name;<br /> private int weight;<br /> private int yearOfBirth;<br />public static int CompareName(object p1, object p2)<br /> {<br /> return string.Compare(((Person)p1).name, ((Person)p2).name);<br /> }<br />}<br />
  41. 41. Solution<br />18<br />16/01/2011<br /> //…<br /> Person[] persons= new Person[4];<br /> persons[0] = new Person(“QuyMui",20,2004);<br /> persons[1] = new Person(“Ha Giang",62,1978);<br /> persons[2] = new Person(“Ngoc Thao",47, 1979);<br /> persons[3] = new Person(“Ha Nam",4,2009);<br />// create instance of delegate refer to Person.CompareName<br /> CompareObjcmp = new CompareObj(Person.CompareName);<br />HaGLib.Sort(persons,cmp);<br />Class contains static Sort method <br />
  42. 42. 19<br />16/01/2011<br />Demo 2 <br />
  43. 43. 20<br />16/01/2011<br />Event<br />
  44. 44. Event<br />Cơ chế thông điệp giữa các lớp hay các đối tượng<br />Có thể thông báo cho lớp khác biết được khi một lớp có phát sinh điều gì đó<br />Publisher: lớp phát sinh sự kiện<br />Subscriber: lớp nhận hay xử lý khi sự kiện xảy ra<br />21<br />16/01/2011<br />
  45. 45. Event<br />Trong môi trường giao diện GUIs (Graphical User Interfaces: GUIs):<br />Button đưa ra sự kiện “Click”, cho phép lớp khác có thể đáp ứng (xử lý) khi sự kiện này xảy ra.<br />VD: Button “Add” trong Form, khi sự kiện click xảy ra thì Form thực hiện lấy dữ liệu từ các TextBox đưa vào ListBox…<br />22<br />16/01/2011<br />
  46. 46. Event<br />Một lớp publish tập các event cho phép các lớp khác subscribe<br />Button là lớp publish đưa ra event: click <br />Form là lớp subscribe có phần xử lý riêng khi “click” của Button kích hoạt.<br />23<br />16/01/2011<br />event<br />subscribe<br />Thông báo<br />publish<br />B<br />A<br />Đăng ký<br />C<br />
  47. 47. Event & Delegate<br />Sự kiện trong C# được thực thi nhờ uỷ thác<br />Lớp publishing định nghĩa ủy thác<br />Những lớp subscribing phải thực thi<br />Khi sự kiện xuất hiện thì phương thức của lớp subscribing được gọi thông qua uỷ thác.<br />Phương thức để xử lý sự kiện gọi là trình xử lý sự kiện (event handler)<br />24<br />16/01/2011<br />
  48. 48. Event & Delegate<br /><ul><li>Trìnhxửlýsựkiệntrong .NET Framework đượcmôtảnhưsau:
  49. 49. Trảvềgiátrị void
  50. 50. Thamsố 1: nguồnphátsinhsựkiện, đâychínhlàđốitượng publisher
  51. 51. Thamsố 2: làđốitượngthuộclớpdẫnxuấttừEventArgs
  52. 52. Phảithựchiệntrìnhxửlýsựkiệntheođúngmẫutrên!</li></ul>25<br />16/01/2011<br />
  53. 53. Event & Delegate<br />26<br />16/01/2011<br /><ul><li>Khai báo delegate xử lý sự kiện
  54. 54. Khai báo event
  55. 55. Các lớp muốn xử lý khi sự kiện OnEventName phát sinh thì phải thực thi event handler</li></ul>public delegate void HandlerName(object obj, EventArgsarg);<br />public event HandlerName OnEventName;<br />
  56. 56. Minh họa<br />Xây dựng 1 lớp thực hiện yêu cầu: “cứ mỗi giây sẽ phát sinh 1 sự kiện”<br />Cho phép 2 lớp khác đăng ký xử lý sự kiện này, mỗi lớp có cách xử lý riêng:<br />Lớp A: hiển thị thời gian theo “mô phỏng đồng hồ analog”<br />Lớp B: hiển thị thời gian theo “mô phỏng đồng hồ digital”<br />27<br />16/01/2011<br />
  57. 57. Minh họa<br />Tạo một lớp Clock:<br />Khai báo một event: OnSecondChange<br />Một phương thức Run: cứ 1s thì phát sinh sự kiện OnSecondChange<br />Tạo 2 lớp: AnalogClock và DigitalClock nhận xử lý sự kiện OnSecondChange của lớp Clock<br />28<br />16/01/2011<br />
  58. 58. Minh họa<br />Khai báo delegate xử lý event<br />29<br />16/01/2011<br />Tên delegate xửlýsựkiện<br />delegate void SecondChangeHandler(object clock, EventArgs info);<br />Đối tượng phát sinh event<br />Tham số kiểu EventArgs<br />
  59. 59. Minh họa<br />Khai báo event có hàm xử lý mô tả trên <br />30<br />16/01/2011<br />Kiểu delegate<br />event SecondChangeHandlerOnSecondChange;<br />Tên của event<br />Từ khóa event: thể hiện cơ chế publishing & subscribing<br />
  60. 60. Minh họa<br />Kích hoạt sự kiện<br />31<br />16/01/2011<br />Kiểm tra xem có hàm xử lý <br />được đăng ký hay không?<br />if (OnSecondChange != null)<br /> OnSecondChange(this, new EventArgs());<br />Gọi hàm xử lý sự kiện đã đăng ký<br />
  61. 61. Minh họa<br />32<br />16/01/2011<br />public class Clock{<br /> public delegate void <br />SecondChangeHandler(object clock, EventArgs info);<br /> public event SecondChangeHandlerOnSecondChange;<br /> public void Run() {<br /> while (true){<br /> Thread.Sleep(1000);<br /> if (OnSecondChange != null)<br />OnSecondChange(this, new EventArgs());<br /> }<br /> }<br />}<br />
  62. 62. Minh họa<br />Lớp DigitalClock<br />Định nghĩa trình xử lý sự kiện của Clock<br />Đúng mô tả delegate hàm xử lý của lớp Clock<br />Thực hiện một số thao tác riêng của DigitalClock<br />Đăng ký xử lý với trình xử lý sự kiện trên khi có sự kiện OnSecondChange của Clock<br />Chức năng đăng ký với lớp Clock là có xử lý khi sự kiện OnSencondChange của Clock phát sinh<br />Ủy thác cho lớp Clock sẽ gọi trình xử lý định nghĩa bên trên của DigitalClock<br />33<br />16/01/2011<br />
  63. 63. Minh họa<br />Trình xử lý của DigitalClock<br />34<br />16/01/2011<br />Đối tượng phát sinh sự kiện<br />Tên của trình xử lý<br />public void Show(object obj, EventArgs args)<br />{<br /> DateTime date = DateTime.Now;<br /> Console.WriteLine("Digital Clock: {0}:{1}:{2}", date.Hour, date.Minute, date.Second);<br />}<br />
  64. 64. Minh họa<br />Đăng ký xử lý sự kiện<br />35<br />16/01/2011<br />Đối tượng này sẽ <br />phát sinh sự kiện<br /> public void Subscribe(Clock theClock)<br />{ <br /> theClock.OnSecondChange += <br />new Clock.SecondChangeHandler(Show);<br />}<br />Ủy thác phương thức Show choOnSecondChange<br />
  65. 65. Minh họa<br />36<br />16/01/2011<br />public class DigitalClock<br />{<br /> public void Subscribe(Clock theClock)<br /> { <br />theClock.OnSecondChange += new Clock.SecondChangeHandler(Show);<br /> }<br /> public void Show(object obj, EventArgs args)<br /> {<br /> DateTime date = DateTime.Now;<br /> Console.WriteLine("Digital Clock: {0}:{1}:{2}", date.Hour, date.Minute, date.Second);<br /> }<br />}<br />
  66. 66. Minh họa<br />Lớp AnalogClock<br />Định nghĩa trình xử lý sự kiện của Clock<br />Đúng mô tả delegate hàm xử lý của lớp Clock<br />Thực hiện một số thao tác riêng của AnalogClock<br />Đăng ký xử lý với trình xử lý sự kiện trên khi có sự kiện OnSecondChange của Clock<br />Chức năng đăng ký với lớp Clock là có xử lý khi sự kiện OnSencondChange của Clock phát sinh<br />Ủy thác cho lớp Clock sẽ gọi trình xử lý định nghĩa bên trên của AnalogClock<br />37<br />16/01/2011<br />
  67. 67. Minh họa<br />38<br />16/01/2011<br />public class AnalogClock<br />{<br /> public void Subscribe(Clock theClock)<br /> {<br />theClock.OnSecondChange += new Clock.SecondChangeHandler(Show);<br /> }<br /> public void Show(object obj, EventArgs args)<br /> {<br /> DateTime date = DateTime.Now;<br /> Console.WriteLine("Analog Clock: {0}:{1}:{2}",date.Hour,date.Minute,date.Second);<br /> }<br />}<br />
  68. 68. Minh họa<br />Minh họa cơ chế event<br />39<br />16/01/2011<br />public class Tester{<br /> public static void Main(){<br /> Clock myClock = new Clock();<br /> AnalogClock c1 = new AnalogClock();<br /> DigitalClock c2 = new DigitalClock();<br />c1.Subscribe(myClock);<br />c2.Subscribe(myClock);<br />myClock.Run();<br /> }<br />}<br />Đăng ký xử lý sự kiện của đối tượng myClock!<br />Phát sinh sự kiện<br />
  69. 69. Minh họa<br />40<br />16/01/2011<br />public static void Main() {<br /> Clock myClock = new Clock();<br /> AnalogClock c1 = new AnalogClock();<br /> DigitalClock c2 = new DigitalClock();<br />myClock.OnSecondChange += new <br />Clock.SecondChangeHandler(c1.Show);<br />myClock.OnSecondChange += new <br />Clock.SecondChangeHandler(c2.Show);<br />myClock.Run();<br /> }<br />Đượckhông?<br />
  70. 70. 41<br />16/01/2011<br />Demo Event<br />
  71. 71. Minh họa EventArgs<br /><ul><li>Hạnchế:
  72. 72. Mỗilớpsubscibingphảilấygiờhiệnhànhriêng trùng
  73. 73. Nêntruyềnthamsốtừlớp publishing ngaykhiphátsinhsựkiện
  74. 74. Giảipháp:
  75. 75. Khiphátsinhsựkiện, truyềnthờigianhiệnhành  lớp subscribing sẽsửdụngthamsốnày
  76. 76. TạomộtlớpTimeEventArgskếthừatừEventArgs: chứathờigiansẽtruyềnđi</li></ul>42<br />16/01/2011<br />
  77. 77. Minh họa EventArgs<br />Tạo lớp chứa tham số truyền cho trình xử lý sự kiện<br />Lớp dẫn xuất từ EventArgs<br />Chứa các thông tin về: giờ, phút, giây<br />Bắt buộc phải dẫn xuất từ EventArgs<br />Do mô tả của trình xử lý sự kiện là tham số thứ 2 phải là lớp dẫn xuất từ EventArgs!<br />43<br />16/01/2011<br />
  78. 78. Minh họa EventArgs<br />44<br />16/01/2011<br />public class TimeEventArgs : EventArgs<br />{<br /> public readonly int Second;<br /> public readonly int Minute;<br /> public readonly int Hour;<br /> public TimeEventArgs(int s, int m, int h)<br /> {<br /> Second = s;<br /> Minute = m;<br /> Hour = h;<br /> }<br />}<br />
  79. 79. Minh họa EventArgs<br />Trong lớp Clock khai báo trình xử lý sự kiện như sau<br />45<br />16/01/2011<br />public delegate void SecondChangeHandler(object obj, TimeEventArgs arg);<br />Sử dụng tham số thứ hai có kiểu TimeEventArgs<br />
  80. 80. Minh họa EventArgs<br />Khi kích hoạt sự kiện thì truyền tham số {giờ, phút, giây}<br />46<br />16/01/2011<br />public void Run() {<br /> while (true) {<br /> Thread.Sleep(1000);<br /> if (OnSecondChange != null) {<br /> DateTime date = DateTime.Now;<br /> TimeEventArgs timeArg = new TimeEventArgs(date.Second, date.Minute, date.Hour);<br /> OnSecondChange(this, timeArg);<br /> }<br /> }<br />}<br />
  81. 81. Minh họa EventArgs<br />Các lớp DigitalClock và AnalogClock: sử dụng tham số truyền vào<br />47<br />16/01/2011<br />public class AnalogClock {<br /> public void Subcribe(Clock theClock)<br /> { <br /> theClock.OnSecondChange += new Clock.SecondChangeHandler(Show);<br /> }<br /> public void Show(object obj, TimeEventArgs timeArg)<br /> {<br /> Console.WriteLine("Analog Clock: {0}:{1}:{2}", timeArg.Hour, timeArg.Minute, timeArg.Second);<br /> }<br />}<br />
  82. 82. Minh họa EventArgs<br />Các phần khác còn lại tương tự như minh họa 1<br />48<br />16/01/2011<br />Demo Eventc<br />
  83. 83. Event<br />Bài tập<br />49<br />16/01/2011<br />Viết một chương trình đơn giản minh họa quản lý tài khoản ATM: khi rút tiền hoặc chuyển tiền thì hệ thống sẽ gởi tự động tin nhắn đến handphone của chủ tài khoản.<br />Hướng dẫn:<br />- Khi rút tiền hoặc chuyển tiền xong: phát sinh sự kiện “đã rút tiền” hoặc “đã chuyển tiền”<br />
  84. 84. Tóm tắt<br /><ul><li>Delegate
  85. 85. Cho phéptạothểhiện
  86. 86. Thamchiếuđếnmộtphươngthức
  87. 87. Multi cast delegate thamchiếuđếnnhiềuphươngthức
  88. 88. Multi cast là delegate cógiátrịtrảvềphảilàvoid
  89. 89. Cácphươngthứcđượcủyquyềnphảithoả signature method của delegate
  90. 90. Khi delegate đượcgọinósẽthựcthitấtcảcácphươngthứcđượcủyquyền</li></ul>50<br />16/01/2011<br />
  91. 91. Tóm tắt<br />Event<br />Event được thực thi thông qua delegate<br />Thể hiện sự truyền thông qua lại<br />Lớp phát sinh sự kiện: publishing<br />Những lớp xử lý sự kiện: subscribing<br />Thành phần quan trọng trong GUIs<br />51<br />16/01/2011<br />
  92. 92. Delegate & Event<br />52<br />16/01/2011<br />?<br />

×