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

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

pptx29 trang | Chia sẻ: huyhoang44 | Lượt xem: 685 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Lập trình Windows - Chương 2: Ngôn ngữ lập trình C# - Phần 3, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Lập trình Windows Chương 2. Ngôn ngữ lập trình C# Phần 31Nội dungDelegateEvent2DelegateKhá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.DelegateSystem.MulticastDelegateUser-delegateUser-delegateCác bước sử dụng delegateBước 1: Khai báo kiểu delegateBước 2: Tạo đối tượng delegateBước 3: Gắn phương thức vào đối tượng delegateBước 4: Gọi đối tượng delegateKhai báo kiểu delegate[attributes][modifiers] delegate  (parameterlist);delegate void DelegateType1(); delegate int DelegateType2(); delegate double DelegateType3(double x, double y); delegate void EventHandler(EventArgs e);void Method1(); int Method2(); double Method3(double x, double y); void Method4(EventArgs e);Ví dụTạo đối tượng delegateDelegateName 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ứcTạ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 delegateCác phương thức này được lưu trong invocation list của delegateMỗ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ứcGọi đối tượng delegateobjD(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ùngGọi đối tượng delegatenamespace 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; } }}Phép toán trên delegateobjD1 = objD2 + objD3 objD1 += objD4objD1 = objD2 - objD3 objD1 -= objD4Ứng dụngCó 2 cách dùng quan trọng của delegateCho 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ệnBài tậpViết phương thức sắp xếp bằng interfaceViết phương thức sắp xếp bằng delegateEventKhái niệmEvent 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áoclass ClassName { public event DelegateName objE; }So sánh delegate và eventdelegatenamespace Delegate.Example2{ delegate void DelegateType(); class ClassA { public DelegateType objD; public void Method() { if (objD != null) objD(); } }}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(); } }So sánh delegate và eventSự kiệnnamespace Delegate.Event.Example{ delegate void DelegateType(); class ClassA { public event DelegateType objE; public void Method() { if (objE != null) objE(); } }}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(); } }So sánh delegate và eventNhận xétEvent là trường hợp đặc biệt của delegateKhông được sử dụng phép gán = trên eventChỉ được dùng phép toán += hay -= trên eventEvent chỉ được gọi bên trong lớp nó đang khai báoỨ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 tinSau đó phân phối thông tin đó đến lớp XLàm thế nào?AClient XGởi thông tin cho clientDesignerUser/ClientỨng dụng Tiếp cận thứ 1 – tiếp cận từ phía client: Kỹ thuật pollingX đị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 AClient XLấy thông tin vềDesignerUser/ClientKiểm tra định kỳỨ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 XAClient XCung cấp tên một phương thức M cho lớp AGọi phương thức M khi cần thông báo cho client DesignerUser/ClientEvent 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Ứng dụng Các bước tổng quátLớp A định nghĩa một sự kiệnLớ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)Lớp X đăng ký event handler này cho sự kiện của AỨ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ư sauClass designerKhai 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ênGọi event khi có tác động nào đó xảy raỨ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 Ứng dụngclass 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Ứng dụngEventHandler được định nghĩa trong Namespace Systempublic 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Ứng dụngclass Client { void AlertMethod(object sender, EventArgs e) { // Xử lý event } public void MyMethod() { MyClass a = new MyClass(); a.InformationAlert += AlertMethod; } }Q&A29

Các file đính kèm theo tài liệu này:

  • pptxlap_trinh_tren_windows_chuong2_ngonngulaptrinhc_part3_26.pptx