Lập trình Windows - Chương 2: Ngôn ngữ lập trình C# (Phần 3)

pptx 29 trang vanle 1730
Bạn đang xem 20 trang mẫu của tài liệu "Lập trình Windows - Chương 2: Ngôn ngữ lập trình C# (Phần 3)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptxlap_trinh_windows_chuong_2_ngon_ngu_lap_trinh_c_phan_3.pptx

Nội dung text: Lập trình Windows - Chương 2: Ngôn ngữ lập trình C# (Phần 3)

  1. Lập trình Windows Chương 2. Ngôn ngữ lập trình C# Phần 3 1
  2. Nội dung • Delegate • Event 2 2
  3. Delegate
  4. Khái niệm • Kiểu delegate là cho phép khai báo các biến (đối tượng) tham chiếu đến các phương thức (có chữ ký do delegate quy định) System.Delegate System.MulticastDelegate User-delegate User-delegate 4
  5. Các bước sử dụng delegate Bước 1: Khai báo kiểu delegate Bước 2: Tạo đối tượng delegate Bước 3: Gắn phương thức vào đối tượng delegate Bước 4: Gọi đối tượng delegate 5
  6. Khai báo kiểu delegate [attributes][modifiers] delegate (parameterlist); ▪ Ví dụ void Method1(); int Method2(); double Method3(double x, double y); void Method4(EventArgs e); delegate void DelegateType1(); delegate int DelegateType2(); delegate double DelegateType3(double x, double y); delegate void EventHandler(EventArgs e); 6
  7. Tạo đối tượng delegate DelegateName objD; objD = new DelegateName(obj.methodName); objD = new DelegateName(methodName); objD = obj.methodName; objD = obj.methodName; Đối tượng delegate có thể được khai báo như là field, tham số của phương thức, biến cục bộ của phương thức 7
  8. Tạo đối tượng delegate • Bất kỳ phương thức nào phù hợp với chữ ký của delegate đều có thể gán cho đối tượng delegate • Các phương thức này được lưu trong invocation list của delegate • Mỗi khi một delegate được gán bằng một phương thức thì biến đó hoạt động như một phương thức 8
  9. Gọi đối tượng delegate objD(parameterList); ▪ Một lời gọi đến delegate sẽ gọi tất cả các phương thức trong invocation list theo đúng thứ tự ▪ Nếu invocation list rỗng thì sẽ ném ra một ngoại lệ NullReferenceException ▪ Nếu kiểu trả về của các phương thức khác void thì kết quả trả về của delegate là kết quả của phương thức cuối cùng 9
  10. Gọi đối tượng delegate namespace Delegate.Example1 { delegate int DelegateType(int x, int y); class Program { static void Main(string []args) { Program obj = new Program(); DelegateType a = new DelegateType(obj.TinhTong); int kq = a(3, 4); Console.WriteLine("Ket qua = {0}", kq); } int TinhTong(int a, int b) { return a + b; } } } 10
  11. Phép toán trên delegate objD1 = objD2 + objD3 objD1 += objD4 objD1 = objD2 - objD3 objD1 -= objD4 11
  12. Ứng dụng • Có 2 cách dùng quan trọng của delegate • Cho phép hàm được truyền như là tham số của hàm khác (tạo hàm callback) • Tạo các sự kiện • Bài tập • Viết phương thức sắp xếp bằng interface • Viết phương thức sắp xếp bằng delegate 12
  13. Khái niệm Event là một field thuộc kiểu delegate mà chỉ được gọi từ bên trong của lớp mà nó được khai báo class ClassName { public event DelegateName objE; } 14
  14. So sánh delegate và event namespace Delegate.Example2 { delegate void DelegateType(); class ClassA delegate { public DelegateType objD; public void Method() { if (objD != null) objD(); } } } 15
  15. So sánh delegate và event class ClassB { public void Xuat1() { Console.WriteLine("Xuat 1"); } public void Xuat2() { Console.WriteLine("Xuat 2"); } public void Ham() { ClassA p = new ClassA(); p.objD = Xuat1; p.objD += Xuat2; p.objD(); p.Method(); } } 16
  16. So sánh delegate và event namespace Delegate.Event.Example { delegate void DelegateType(); Sự kiện class ClassA { public event DelegateType objE; public void Method() { if (objE != null) objE(); } } } 17
  17. So sánh delegate và event class ClassB { public void Xuat1() { Console.WriteLine("Xuat 1"); } public void Xuat2() { Console.WriteLine("Xuat 2"); } public void Ham() { ClassA p = new ClassA(); p.objE = Xuat1; //Error p.objE += Xuat1; p.objE += Xuat2; p.objE(); //Error p.Method(); } }
  18. So sánh delegate và event • Nhận xét • Event là trường hợp đặc biệt của delegate • Không được sử dụng phép gán = trên event • Chỉ được dùng phép toán += hay -= trên event • Event chỉ được gọi bên trong lớp nó đang khai báo 19
  19. Ứng dụng • Ngữ cảnh: Giả sử có 2 lớp A, lớp X: Lớp A là lớp tiện ích, lớp X là lớp client • Lớp A có nhiệm vụ tập hợp thông tin • Sau đó phân phối thông tin đó đến lớp X Client X • Làm thế nào? A User/Client Designer 20
  20. Ứng dụng • Tiếp cận thứ 1 – tiếp cận từ phía client: Kỹ thuật polling • X định kỳ kiểm tra bool property trong lớp A • Nếu giá trị này bằng true thì gọi phương thức trong lớp A để lấy dữ liệu Client X A User/Client Designer 21
  21. Ứng dụng • Tiếp cận thứ 2 – tiếp cận từ phía designer: Lớp A gọi phương thức trong lớp X Cung cấp tên một phương thức M cho lớp A Client X A Gọi phương thức M khi cần thông báo cho client User/Client Designer ▪ Event của một lớp A có thể được dùng như là một cách để thông báo cho client đang dùng lớp A biết điều gì đó đã xảy ra trên đối tượng của lớp A 22
  22. Ứng dụng • Các bước tổng quát 1. Lớp A định nghĩa một sự kiện 2. Lớp X định nghĩa một phương thức để truyền cho sự kiện trong A (gọi phương thức này là event handler) 3. Lớp X đăng ký event handler này cho sự kiện của A 23
  23. Ứng dụng • Có nhiều cách tạo/sử dụng event, nhưng thông thường theo cách chuẩn như sau • Class designer • Khai báo kiểu delegate có hai tham số • Tham số thứ nhất thuộc lớp object, chứa đối tượng phát sinh sự kiện (VD: Đối tượng lớp A) • Tham số thứ hai thuộc lớp dẫn xuất từ EventArgs, chứa thông tin cần truyền cho client • Định nghĩa public event thuộc kiểu delegate trên • Gọi event khi có tác động nào đó xảy ra 24
  24. Ứng dụng • Client • Định nghĩa phương thức event handler theo chữ ký của kiểu delegate • Đăng ký event handler này với sự kiện 25
  25. Ứng dụng class MyClass { public event EventHandler InformationAlert; public void Method() { if (InformationAlert!= null) InformationAlert(this, new EventArgs()); } } • Sự kiện: • Tên sự kiện là InformationAlert • Thuộc kiểu delegate EventHandler được định nghĩa trước trong .NET 26
  26. Ứng dụng • EventHandler được định nghĩa trong Namespace System public delegate void EventHandler(object sender, EventArgs e); ▪ EventArgs là lớp được định nghĩa trong namespace System, là lớp được dùng làm cơ sở cho những lớp được dùng liên quan đến event 27
  27. Ứng dụng class Client { void AlertMethod(object sender, EventArgs e) { // Xử lý event } public void MyMethod() { MyClass a = new MyClass(); a.InformationAlert += AlertMethod; } } 28
  28. Q&A 29 29