1. Trang chủ
  2. » Công Nghệ Thông Tin

Cơ chế sự kiện

15 252 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 115,27 KB

Nội dung

Cơ chế kiện Cơ chế kiện Bởi: Khuyet Danh Sự kiện Trong môi trường giao diện đồ họa, thành phần đưa kiện Ví dụ, kích vào nút lệnh, đưa kiện Click Khi thêm mục vào danh sách, đưa kiện ListChanged Cơ chế publishing subscribing Trong ngôn ngữ C#, đối tượng publish tập hợp kiện lớp khác đăng ký Khi lớp publish đưa kiện, tất lớp đăng ký nhận cảnh báo Tác giả Gamma (Addison Wesley, 1995) mô tả chế sau: “Định nghĩa đến nhiều phụ thuộc đối tượng đối tượng thay đổi trạng thái, tất đối tượng khác phụ thuộc vào cảnh báo cập nhật cách tự động” Với chế này, đối tượng nói “Ở có thứ mà thông báo cho bạn” lớp khác đăng ký đáp “Vâng, báo cho biết chuyện xảy ra” Một nút lệnh cảnh báo cho thành phần nhấn Nút lệnh gọi publisher phân phát kiện Click lớp khác lớp subscriber chúng đăng ký nhận kiện Click Sự kiện delegate Những kiện C# thực thi với delegate Lớp publisher định nghĩa delegate lớp subscriber phải thực thi Khi kiện xuất phương thức lớp subscriber gọi thông qua delegate Một phương thức dùng để xử lý kiện trình xử lý kiện (event handler) Chúng ta khai báo trình xử lý kiện làm với delegate khác 1/15 Cơ chế kiện Theo quy ước, trình xử lý kiện NET Framework trả giá trị void lấy hai tham số Tham số nguồn dẫn đến kiện, đối tượng publisher Và tham số thứ hai đối tượng dẫn xuất từ lớp EventArgs Yêu cầu phải thực trình xử lý kiện theo mẫu EventArgs lớp sở cho tất liệu kiện, lớp EventArgs thừa kế tất phương thức từ Object, thêm vào trường public static empty thể kiện trạng thái (cho phép sử dụng hiệu kiện không trạng thái) Lớp dẫn xuất từ EventArgs chứa thông tin kiện Sự kiện thuộc tính lớp phát kiện Từ khóa event điều khiển cách thuộc tính kiện truy cập lớp subscriber Từ khóa event thiết kế để trì cho cách thể publish/ subscribe Giả sử muốn tạo lớp Clock dùng kiện để cảnh báo lớp subscriber đồng hồ hệ thống thay đổi giá trị giây Gọi kiện OnSecondChange Chúng ta khai báo kiện kiểu delegate xử lý kiện sau: [attributes] [modifiers] event type member- name Ví dụ khai báo sau: public event SecondChangeHandler OnSecondChange; Trong ví dụ ta không dùng thuộc tính, modifier abstract, new, override, static, virtual, bốn access modifier, trường hợp public Modifier theo sau từ khóa event Trường type trường hợp ví dụ delegate mà muốn liên hệ với kiện, SecondChangeHandler Tên thành viên tên kiện, trường hợp OnSecondChange Thông thường, tên kiện bắt đầu với từ On Tóm lại, khai báo OnSecondChange kiện thực thi delegate có kiểu SecondChangeHandler Ta có khai báo cho delegate sau: public delegate void SecondChangeHandler( TimeInfoEventArgs timeInformation); object clock, 2/15 Cơ chế kiện Như nói trước đây, theo quy ước trình xử lý kiện phải trả giá trị void phải lấy hai tham số: nguồn phát kiện (trong trường hợp clock) đối tượng dẫn xuất từ EventArgs, TimeInfoEventArgs Lớp TimeInfoEventArgs định nghĩa sau: public class TimeInfoEventArgs : EventArgs { public TimeInfoEventArgs(int hour, int minute, int second) { this.hour = hour; this.minute = minute; this.second = second; } public readonly int hour; public readonly int minute; public readonly int second; } Đối tượng TimeInfoEventArgs có thông tin phút giây thời Nó định nghĩa khởi tạo, ba phương thức, biến nguyên readonly Ngoài việc thêm vào kiện delegate, lớp đối tượng Clock có ba biến thành viên :hour, minute, second Cuối phương thức Run(): public void Run() { for(;;) { 3/15 Cơ chế kiện // ngừng 10 giây Thread.Sleep( 10 ); // lấy thời gian hành System.DateTime dt = System.DateTime.Now; // giây thay đổi cảnh báo cho subscriber if ( dt.Second != second) { // tạo TimeInfoEventArgs để truyền // cho subscriber TimeInfoEventArgs timeInformation = new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second); // có lớp đăng ký cảnh báo if ( OnSecondChange != null) { OnSecondChange( this, timeInformation); } } // cập nhật trạng thái this.second = dt.Second; this.minute = dt.Minute; this.hour = dt.Hour; } 4/15 Cơ chế kiện } Phương thức Run tạo vòng lặp vô hạn để kiểm tra định kỳ thời gian hệ thống Nếu thời gian thay đổi từ đối tượng Clock hành, cảnh báo cho tất subscriber sau cập nhật lại trạng thái Bước ngừng 10 giây: Thread.Sleep(10); Ở sử dụng phương thức tĩnh lớp Thread từ System.Threading NET Sử dụng phương thức Sleep() để kéo dài khoảng cách hai lần thực vòng lặp Sau ngừng 10 mili giây, phương thức kiểm tra thời gian hành: System.DateTime dt = System.DateTime.Now; Cứ khoảng 100 lần kiểm tra, giây gia tăng Phương thức ghi nhận thay đổi cảnh báo đến subscriber Để làm điều này, phải tạo đối tượng TimeInfoEventArgs: if ( dt.Second != second) { // tạo TimeInfoEventArgs để truyền cho subscriber TimeInfoEventArgs timeInformation =new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second); } Và để cảnh báo cho subscriber cách kích hoạt kiện OnSecondChange: // cảnh báo cho subscriber if ( OnSecondChange != null) { 5/15 Cơ chế kiện OnSecondChange( this, timeInformation); } Nếu kiện lớp subscriber đăng ký ước lượng giá trị null Phần kiểm tra bên xác định giá trị kiện có phải null hay không, để đảm bảo có tồn lớp đăng ký nhận kiện trước gọi kiện OnSecondChange OnSecondChange lấy hai tham số: nguồn phát kiện đối tượng dẫn xuất từ lớp EventArgs Ở thấy tham chiếu this lớp clock truyền clock nguồn phát kiện Tham số thứ hai đối tượng TimeInfoEventArgs tạo dòng lệnh bên Một kiện phát gọi phương thức đăng ký với lớp Clock thông qua delegate, kiểm tra điều sau Một mà kiện phát ra, cập nhật lại trạng thái lớp Class: this.second = dt.Second; this.minute = dt.Minute; this.hour = dt.Hour; Sau xây dựng lớp đăng ký vào kiện Chúng ta tạo hai lớp Lớp lớp DisplayClock Chức lớp lưu giữ thời gian mà để hiển thị thời gian hành hình console Để đơn giản tạo hai phương thức cho lớp Phương thức thứ có tên Subscribe, phương thức chịu trách nhiệm đăng ký kiện OnSecondChange lớp Clock Phương thức thứ hai tạo trình xứ lý kiện TimeHasChanged: public class DisplayClock { public void Subscrible(Clock theClock) { theClock.OnSecondChange Clock.SecondChangeHandler(TimeHasChanged); +=new 6/15 Cơ chế kiện } public void TimeHasChanged( TimeInfoEventArgs ti) object theClock, { Console.WriteLine("Current Time: ti.hour.ToString(), ti.minute.ToString(), {0]:{1}:{2}", ti.Second.ToString()); } } Khi phương thức Subscribe gọi, tạo delegate SecondChangeHandler mới, truyền vào phương thức xử lý kiện TimeHasChanged Sau đăng ký delegate với kiện OnSecondChange Clock Lớp thứ hai mà tạo đáp ứng kiện này, tên LogCurrentTime Thông thường lớp ghi lại kiện vào tập tin, với mục đích minh họa chúng ta,nó ghi hình console: public class LogCurrentTime { public void Subscribe(Clock theClock) { theClock.OnSecondChange Clock.SecondChangeHandler(WriteLogEntry); +=new } // thông thường phương thức viết file // minh họa xuất // hình console mà 7/15 Cơ chế kiện public void WriteLogEntry( TimeInfoEventArgs ti) object theClock, { Console.WriteLine("Logging ti.hour.ToString(), to file: {0}:{1}:{2}", ti.minute.ToString(), ti.second.ToString()); } } Những kiện thêm vào cách sử dụng toán tử += Điều cho phép kiện thêm vào kiện OnSecondChange đối tượng Clock mà phá hủy kiện đăng ký Khi LogCurrentTime đăng ký kiện OnSecondChange, không muốn việc đăng ký làm đăng ký lớp DisplayClock trước Tất phần lại cần thực tạo lớp Clock, tạo mộ đối tượng DisplayClock bảo đăng ký kiện Sau tạo đối tượng LogCurrentTime đăng ký kiện tương tự Cuối thực thi phương thức Run Clock Tất phần trình bày ví dụ sau Làm việc với kiện namespace Programming_Csharp { using System; using System.Threading; // lớp lưu giữ thông tin kiện, trường hợp // lưu giữ thông tin có giá trị lớp clock public class TimeInfoEventArgs : EventArgs 8/15 Cơ chế kiện { public TimeInfoEventArgs(int hour, int minute, int second) { this.hour = hour; this.minute = minute; this.second = second; } public readonly int hour; public readonly int minute; public readonly int second; } // khai báo lớp Clock lớp phát kiện public class Clock { // khai báo delegate mà subscriber phải thực thi public delegate void SecondChangeHandler(object TimeInfoEventArgs timeInformation); clock, // kiện mà đưa public event SecondChangeHandler OnSecondChange; // thiết lập đồng hồ thực hiện, phát kiện giây public void Run() { 9/15 Cơ chế kiện for(;;) { // ngừng 10 giây Thread.Sleep( 10 ); // lấy thời gian hành System.DateTime dt = System.DateTime.Now; // giây thay đổi cảnh báo cho subscriber if ( dt.Second != second) { // tạo TimeInfoEventArgs để truyền // cho subscriber TimeInfoEventArgs timeInformation =new TimeInfoEventArgs( dt.Hour, dt.Minute, dt.Second); // có lớp đăng ký cảnh báo if ( OnSecondChange != null) { OnSecondChange( this, timeInformation); } } // cập nhật trạng thái this.second = dt.Second; this.minute = dt.Minute; 10/15 Cơ chế kiện this.hour = dt.Hour; } } private int hour; private int minute; private int second; } // lớp DisplayClock đăng ký kiện clock // thực thi xử lý kiện cách thời gian hành public class DisplayClock { public void Subscrible(Clock theClock) { theClock.OnSecondChange Clock.SecondChangeHandler(TimeHasChanged); +=new } public void TimeHasChanged( TimeInfoEventArgs ti) object theClock, { Console.WriteLine("Current ti.hour.ToString(), Time: {0}:{1}:{2}", ti.minute.ToString(), ti.second.ToString()); } 11/15 Cơ chế kiện } // lớp đăng ký kiện thứ hai public class LogCurrentTime { public void Subscribe(Clock theClock) { theClock.OnSecondChange Clock.SecondChangeHandler(WriteLogEntry); +=new } // thông thường phương thức viết file // minh họa xuất // hình console mà public void WriteLogEntry( TimeInfoEventArgs ti) object theClock, { Console.WriteLine("Logging ti.hour.ToString(), to file: {0}:{1}:{2}", ti.minute.ToString(), ti.second.ToString()); } } // lớp Test minh họa sử dụng kiện public class Test { public static void Main() 12/15 Cơ chế kiện { // tạo đối tượng clock Clock theClock = new Clock(); // tạo đối tượng DisplayClock đăng ký // kiện xử lý kiện DisplayClock dc = new DisplayClock(); dc.Subscribe(theClock); // tạo đối tượng LogCurrent yêu cầu đăng // ký xử lý kiện LogCurrentTime lct = new LogCurrentTime(); lct.Subscribe(theClock); // bắt đầu thực vòng lặp phát sinh kiện // giây đồng hồ theClock.Run(); } } } Kết thực sau: Current Time: 11:54:20 Logging to file: 11:54:20 Current Time: 11:54:21 Logging to file: 11:54:21 13/15 Cơ chế kiện Current Time: 11:54:22 Logging to file: 11:54:22 Điều quan trọng ví dụ minh họa việc tạo hai lớp đối tượng DisplayClock lớp LogCurrentTime Cả hai lớp đăng ký kiện Clock.OnSecondChange lớp thứ ba lớp Clock Lợi ích chế publish/subscribe lớp cảnh báo kiện xuất Những lớp subscriber không cần biết cách mà Clock làm việc, Clock không cần biết cách mà lớp subscriber đáp ứng với kiện mà đưa Publisher subscriber phân tách delegate, mong đợi cao, làm cho mã lệnh linh họat mạnh mẽ Lớp Clock thay đổi cách dò thời gian mà không làm ảnh hưởng đến lớp subscriber Các lớp subscriber thay đổi cách mà chúng đáp ứng với thay đổi thời gian mà không tác động với Clock Cả hai lớp hoạt động độc lập với nhau, làm cho đoạn chương trình dễ trì Câu hỏi trả lời Tóm tắt nét uỷ quyền? Ủy quyền kiểu liệu tham chiếu đươc dùng để đóng gói phương thức với tham số kiểu trả xác định Ủy quyền tương tự trỏ hàm ngôn ngữ C++ Tuy nhiên, ngôn ngữ C# ủy quyền kiểu liệu hướng đối tượng, an toàn bảo mật Con trỏ hàm gì? Trong ngôn ngữ C hay C++, có chức gọi trỏ hàm Một trỏ hàm sử dụng để thiết lập nhiệm vụ ủy quyền Tuy nhiên, trỏ hàm C/C++ đơn giản đối tượng Còn ủy quyền C# kiểu liệu an toàn, dùng để tham chiếu đến phương thức, ủy quyền sử dụng kiện Câu hỏi thêm Có thể sử dụng ủy quyền thuộc tính hay không? Nếu sử dụng nào? Cho biết ý nghĩa? 14/15 Cơ chế kiện Nếu có số hoạt động cần thực theo thứ tự định ta phải làm để cần thực gọi thực hoạt động đó? Công dụng việc khai báo ủy quyền tĩnh? Khi nên khai báo ủy quyền tĩnh không nên? Một ủy quyền gọi nhiều phương thức hay không? Chức C# hỗ trợ ủy quyền này? Có phải tất ủy quyền ủy quyền Multicast hay không? Điều kiện để trở thành ủy quyền Multicast? Các toán tử dùng để thực việc Multicast ủy quyền? Sự kiện gì? Trong hệ thống ứng dụng kiện sử dụng nhiều? Những kiện C# thực thông qua gì? Hãy tóm lược trình tạo kiện giải kiện thông qua chế ủy quyền C#? Bài tập Viết chương trình minh họa sử dụng ủy quyền để thực việc xếp số nguyên mảng? Viết chương trình minh họa sử dụng ủy quyền để thực việc chuyển ký tự thường thành ký tự hoa chuỗi? Viết chương trình kết hợp delegate kiện để minh họa đồng hồ điện tử thể hiện hành hình console 15/15 [...]... quyền đều là ủy quyền Multicast hay không? Điều kiện để trở thành ủy quyền Multicast? Các toán tử nào có thể dùng để thực hiện việc Multicast các ủy quyền? Sự kiện là gì? Trong hệ thống ứng dụng nào thì sự kiện được sử dụng nhiều? Những sự kiện trong C# được thực hiện thông qua cái gì? Hãy tóm lược quá trình tạo một sự kiện và giải quyết sự kiện thông qua cơ chế ủy quyền trong C#? Bài tập Viết chương trình... ti.second.ToString()); } } // lớp Test minh họa sử dụng sự kiện public class Test { public static void Main() 12/15 Cơ chế sự kiện { // tạo ra đối tượng clock Clock theClock = new Clock(); // tạo đối tượng DisplayClock đăng ký // sự kiện và xử lý sự kiện DisplayClock dc = new DisplayClock(); dc.Subscribe(theClock); // tạo đối tượng LogCurrent và yêu cầu đăng // ký và xử lý sự kiện LogCurrentTime lct = new LogCurrentTime();... đăng ký một sự kiện Clock.OnSecondChange của lớp thứ ba là lớp Clock Lợi ích của cơ chế publish/subscribe là bất cứ lớp nào cũng có thể được cảnh báo khi một sự kiện xuất hiện Những lớp subscriber không cần biết cách mà Clock làm việc, và Clock cũng không cần biết cách mà các lớp subscriber đáp ứng với sự kiện mà nó đưa ra Publisher và subscriber được phân tách bởi delegate, đây là một sự mong đợi.. .Cơ chế sự kiện this.hour = dt.Hour; } } private int hour; private int minute; private int second; } // lớp DisplayClock đăng ký sự kiện của clock // thực thi xử lý sự kiện bằng cách hiện thời gian hiện hành public class DisplayClock { public void Subscrible(Clock theClock) { theClock.OnSecondChange... public void TimeHasChanged( TimeInfoEventArgs ti) object theClock, { Console.WriteLine("Current ti.hour.ToString(), Time: {0}:{1}:{2}", ti.minute.ToString(), ti.second.ToString()); } 11/15 Cơ chế sự kiện } // lớp đăng ký sự kiện thứ hai public class LogCurrentTime { public void Subscribe(Clock theClock) { theClock.OnSecondChange Clock.SecondChangeHandler(WriteLogEntry); +=new } // thông thường phương thức... Còn ủy quyền trong C# là kiểu dữ liệu an toàn, được dùng để tham chiếu đến những phương thức, ủy quyền còn được sử dụng bởi những sự kiện Câu hỏi thêm Có thể sử dụng ủy quyền như một thuộc tính hay không? Nếu có thể thì sử dụng như thế nào? Cho biết ý nghĩa? 14/15 Cơ chế sự kiện Nếu có một số hoạt động cần được thực hiện theo một thứ tự nhất định thì ta phải làm thế nào để khi cần thực hiện thì gọi lần... LogCurrentTime(); lct.Subscribe(theClock); // bắt đầu thực hiện vòng lặp và phát sinh sự kiện // trong mỗi giây đồng hồ theClock.Run(); } } } Kết quả thực hiện có thể như sau: Current Time: 11:54:20 Logging to file: 11:54:20 Current Time: 11:54:21 Logging to file: 11:54:21 13/15 Cơ chế sự kiện Current Time: 11:54:22 Logging to file: 11:54:22 ... không làm ảnh hưởng đến bất cứ lớp subscriber nào Các lớp subscriber có thể thay đổi cách mà chúng đáp ứng với sự thay đổi của thời gian mà không tác động với Clock Cả hai lớp này hoạt động độc lập với nhau, và làm cho đoạn chương trình dễ duy trì hơn Câu hỏi và trả lời Tóm tắt những nét cơ bản về uỷ quyền? Ủy quyền là một kiểu dữ liệu tham chiếu đươc dùng để đóng gói phương thức với các tham số và... sắp xếp các số nguyên trong một mảng? Viết chương trình minh họa sử dụng ủy quyền để thực hiện việc chuyển các ký tự thường thành ký tự hoa trong một chuỗi? Viết chương trình kết hợp giữa delegate và sự kiện để minh họa một đồng hồ điện tử thể hiện giờ hiện hành trên màn hình console 15/15 ... sử dụng kiện public class Test { public static void Main() 12/15 Cơ chế kiện { // tạo đối tượng clock Clock theClock = new Clock(); // tạo đối tượng DisplayClock đăng ký // kiện xử lý kiện DisplayClock... không trạng thái) Lớp dẫn xuất từ EventArgs chứa thông tin kiện Sự kiện thuộc tính lớp phát kiện Từ khóa event điều khiển cách thuộc tính kiện truy cập lớp subscriber Từ khóa event thiết kế để trì... timeInformation); object clock, 2/15 Cơ chế kiện Như nói trước đây, theo quy ước trình xử lý kiện phải trả giá trị void phải lấy hai tham số: nguồn phát kiện (trong trường hợp clock) đối tượng

Ngày đăng: 31/12/2015, 21:43

TỪ KHÓA LIÊN QUAN

w