Bài giảng Ngôn ngữ lập trình nâng cao - Bài 6: Ủy quyền, sự kiện - Nguyễn Xuân Hùng
Trong một công ty điều hòa không khí, thời gian làm việc từ 9h
sáng tới 6h chiều. Quản lý công ty khá mềm dảo và cho phép
nhân viên đến làm muộn hơn 1h. Thời gian vào làm việc được
hệ thống ghi vào tập tin khi nhân viên đến làm việc. Ứng dụng
sử dụng cho việc ghi nhận nhân viên đến làm việc với thông
tin thích hợp.
Bạn hãy giúp công ty thiết kế ứng dụng để ghi nhận thời gian
nhân viên tới làm việc
29 trang |
Chia sẻ: huongthu9 | Lượt xem: 572 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Ngôn ngữ lập trình nâng cao - Bài 6: Ủy quyền, sự kiện - Nguyễn Xuân Hùng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Slide 1 of 28Ver. 1.0
Object-Oriented Programming Using C#
NGÔN NGỮ LẬP TRÌNH NÂNG CAO
Slide 2 of 28Ver. 1.0
Object-Oriented Programming Using C#
Trong phần này, chúng ta sẽ học:
Thực thi ủy quyền(delegates)
Thực thi multicast delegates
Sử dụng events với delegates
Mục đích
Slide 3 of 28Ver. 1.0
Object-Oriented Programming Using C#
Giới thiệu Delegates
Delegate trong C# cho phép chúng ta thay đổi linh động
tham chiếu của phương thức trong một class.
Một delegate là biến kiểu tham chiếu, trong đó nó lưu trữ
tham chiếu tới phương thức.
Delegates là một cơ chế hỗ trợ chung cho gọi phương thức
gián tiếp trong khi chạy. Trong lập trình C# delegate được
sử dụng chính vào thực thi sự kiện (event) và các phương
thức gọi sau (call-back methods).
Để thực thi delegate trong ứng dụng của chúng ta, chúng ta
cần khai báo delegates, tạo thể hiện delegates và sử dụng
delegates.
Slide 4 of 28Ver. 1.0
Object-Oriented Programming Using C#
Khai báo Delegates
Các phương thức có thể được tham chiếu bởi một delegate
được xác định bằng các khai báo delegate.
Delegate có thể đề cập tới các phương thức có cùng chữ
ký.
Slide 5 of 28Ver. 1.0
Object-Oriented Programming Using C#
Khai báo Delegates (tiếp.)
Cú pháp khai báo delegate:
delegate<delegate-
name>()
Slide 6 of 28Ver. 1.0
Object-Oriented Programming Using C#
Khởi tạo Delegates
Gán địa chỉ của phương thức yêu cầu đến đối tượng
delegate.
Phương thức này có thể được thực thi bằng cách gọi hàm
tạo của lớp delegate và truyền tên của phương thức.
Slide 7 of 28Ver. 1.0
Object-Oriented Programming Using C#
Khởi tạo Delegates (tiếp)
Ví dụ sau chỉ ra cách thức gán địa chỉ của phương thức vào
một biến delegate:
public void DelegateFunction(string
PassValue)
{
// Thực thi yêu cầu
}
//Khai báo delegate
public delegate void MyDelegate(string
ArgValue);
public void UseMethod()
{
//Khởi tạo delegate
MyDelegate DelegateObject = new
MyDelegate(DelegateFunction);
}
Slide 8 of 28Ver. 1.0
Object-Oriented Programming Using C#
Chúng ta có thể gọi delegate bằng cách đưa ra tên của
delegate và truyền các tham số (nếu có).
Sử dụng delegates tương tự như gọi một phương thức.
Sử dụng Delegate
Slide 9 of 28Ver. 1.0
Object-Oriented Programming Using C#
Ví dụ sau chỉ ra cách thức sử dụng delegate:
using System;
using System.IO;
// Chương trình ghi dữ liệu ra màn hình và file
public class PrintToDevice
{
//Tạo biến của lớp Stream
static FileStream FStream;
static StreamWriter SWriter;
//Định nghĩa một Delegate
//Phương thức gửi chuỗi dữ liệu tới phương thức
Sử dụng Delegate (tiếp)
Slide 10 of 28Ver. 1.0
Object-Oriented Programming Using C#
//Loại bỏ nội dung từ bộ đệm
SWriter.Flush();
SWriter.Close();
FStream.Close();
}
public delegate void PrintData(String s);
//Phương thức để in chuỗi ra màn hình
public static void WriteConsole (string str)
{
Console.WriteLine("{0} Console", str);
}
//Phương thức để ghi chuỗi vào file
public static void WriteFile (string s)
Sử dụng Delegate (tiếp)
Slide 11 of 28Ver. 1.0
Object-Oriented Programming Using C#
{
//Khởi tạo đối tượng stream
FStream = new FileStream("c:\\StoreData.txt",
FileMode.Append, FileAccess.Write);
SWriter = new StreamWriter(FStream);
s= s + " File";
//Ghi chuỗi xuống file
SWriter.WriteLine(s);
}
public static void DisplayData(PrintData PMethod)
{
PMethod ("This should go to the");
}
Sử dụng Delegate (tiếp)
Slide 12 of 28Ver. 1.0
Object-Oriented Programming Using C#
public static void Main()
{
//Khởi tạo đối tượng Delegate
PrintData Cn = new PrintData (WriteConsole);
PrintData Fl = new PrintData (WriteFile);
//Gọi phương thức DisplayData với đối tượng
Delegate như tham số
//Sử dụng Delegate
DisplayData (Cn);
DisplayData (Fl);
Console.ReadLine();
}
}
}
Sử dụng Delegate (tiếp)
Slide 13 of 28Ver. 1.0
Object-Oriented Programming Using C#
Delegates có hai kiểu và phụ thuộc vào yêu cầu của ứng
dụng mà các kiểu của delegate được lựa chọn.
Các kiểu Delegates
Slide 14 of 28Ver. 1.0
Object-Oriented Programming Using C#
Các kiểu Delegates (tiếp)
Có hai kiểu của delegate:
Single-cast delegate
Multicast delegate
Slide 15 of 28Ver. 1.0
Object-Oriented Programming Using C#
Một single-cast delegate dẫn xuất từ lớp System.Delegate.
Nó chứa tham chiếu tới chỉ một phương thức tại một thời
điểm.
Single-Cast Delegate
Slide 16 of 28Ver. 1.0
Object-Oriented Programming Using C#
Multicast Delegate
Một multicast delegate dẫn xuất từ lớp
System.MulticastDelegate.
Nó chứa một lời gọi của danh sách phương thức. Trong
multicasting chúng ta tạo một delegate nhưng gọi nhiều phương
thức được đóng gói.
Chúng ta cần chắc chắn rằng các kiểu trả về của tất cả
delegates này là giống nhau.
Multicast delegates giữ tham chiếu của nhiều hơn một phương
thức do vậy, nếu chúng ta gọi một multicast delegate nó sẽ xử lý
tất cả phương thức theo thứ tự được gọi.
Các phương thức được gọi bởi delegate trong trường hợp này
không nên trả về giá trị. Một vài multicast delegates được gọi
liên tiếp và chúng ta không thể đợi trả về giá trị từ mỗi phương
thức đó.
Slide 17 of 28Ver. 1.0
Object-Oriented Programming Using C#
Câu hỏi
Câu lệnh sau là đúng hay sai?
Multicast delegates kế thừa từ lớp
System.Delegate.MulticastDelegate.
Trả lời:
Sai
Slide 18 of 28Ver. 1.0
Object-Oriented Programming Using C#
Làm việc với Events
Một event là một hành động hoặc sự kiện như là kích, nhấn
bàn phím, di chuyển chuột, hoặc thông báo của hệ thống.
Các ứng dụng có thể đáp ứng các event khi chúng xảy ra.
Slide 19 of 28Ver. 1.0
Object-Oriented Programming Using C#
Làm việc với Events (tiếp)
Hình sau chỉ ra sự kiện đồng hồ và xử lý sự kiện.
Đồng hồ chỉ thời gian.
Thời gian là 6 sáng.
Báo thức hàng ngày của đồng
hồ là 6 sáng.
Chúng ta nghe thấy báo thức.
Chúng ta thức dậy và sẵn
sàng tới trường.
Slide 20 of 28Ver. 1.0
Object-Oriented Programming Using C#
Sử dụng Delegates với Events
events được khai báo và phát sinh trong class và kết hợp
với xử lý event sử dụng delegate trong cùng một class hoặc
class khác.
Events là một phần của class và class cùng tên được sử
dụng để xử lý sự kiện.
Tuy nhiên, các lớp khác có thể chấp nhận những events
này hoặc có thể tập hợp những events này.
Events sử dụng mô hình publisher và subscriber.
publisher là một đối tượng chứa định nghĩa của event và
delegate. Sự kết hợp của event và delegate cũng được xác
định trong lớp publisher.
subscriber là một đối tượng muốn chấp nhận event và cung
cấp xử lý cho event. Delegate của lớp publisher gọi phương
thức của lớp subscriber.
Slide 21 of 28Ver. 1.0
Object-Oriented Programming Using C#
Sử dụng Delegates với Events (tiếp)
Hình sau chỉ ra cơ chế sử dụng bởi các đối tượng của
publisher và subscriber.
Chúng ta cùng tìm hiểu chi tiết về sử dụng delegate với
event.
Slide 22 of 28Ver. 1.0
Object-Oriented Programming Using C#
Sử dụng Delegates với Events (tiếp)
Thực thi một event bao gồm:
Định nghĩa Events
Đăng ký Events
Thông báo Events
Slide 23 of 28Ver. 1.0
Object-Oriented Programming Using C#
Định nghĩa Event:
Định nghĩa event trong một lớp publisher bao gồm việc khai
báo một delegate cũng như khai báo event dựa vào delegate.
Đoạn mã sau định nghĩa một delegate tên là TimeToRise và
một event tên là RingAlarm, event này gọi delegate
TimeToRise khi nó phát sinh:
public delegate void TimeToRise();
private event TimeToRise RingAlarm;
Sử dụng Delegates với Events (tiếp)
Slide 24 of 28Ver. 1.0
Object-Oriented Programming Using C#
Đăng ký Event:
Event của lớp publisher cần kết hợp với việc xử lý nó.
Phương thức để xử lý event liên quan tới việc sử dụng
delegate.
Khi đối tượng publisher phát sinh event, đối tượng đăng ký liên
quan tới phương thức cần được gọi.
Yêu cầu có thể được thực thi sử dụng events. Đoạn mã sau
miêu tả cách thức lớp Student đăng ký sự kiện tên là
TimeToRise:
Student PD= new Student();
RingAlarm += new TimeToRise(PD.WakeUp);
Sử dụng Delegates với Events (tiếp)
Slide 25 of 28Ver. 1.0
Object-Oriented Programming Using C#
Thông báo Subcriber tới Event:
Đối tượng subscriber thông báo cho đối tượng publisher.
Event được phát sinh để thông báo xử lý.
Khối mã sau đặt tại vị trí chúng ta muốn thông báo event cho
event của subscriber:
if (RingAlarm != null)
{
RingAlarm( );
}
Sử dụng Delegates với Events (tiếp)
Slide 26 of 28Ver. 1.0
Object-Oriented Programming Using C#
Phương thức thông báo một event có thể mong muốn một
vài tham số được truyền vào.
Lớp event có thể có đầu vào này khi chạy trên phương thức
đăng ký.
Chúng ta cần định nghĩa một lớp sẽ truyền đầu vào cho
event.
Lớp dẫn xuất này từ System.EventArgs. Để truyền giá trị
cho phương thức đăng ký, chúng ta cần đính kèm các tham
số trong một lớp đơn.
Lớp đơn áp dụng phương thức đặc biệt gọi là phương thức
truy cập để truy xuất giá trị.
Phương thức này được sử dụng để truy cập và biến đổi
thành viên của lớp.
Truyền các tham số Event
Slide 27 of 28Ver. 1.0
Object-Oriented Programming Using C#
Vấn đề đặt ra:
Trong một công ty điều hòa không khí, thời gian làm việc từ 9h
sáng tới 6h chiều. Quản lý công ty khá mềm dảo và cho phép
nhân viên đến làm muộn hơn 1h. Thời gian vào làm việc được
hệ thống ghi vào tập tin khi nhân viên đến làm việc. Ứng dụng
sử dụng cho việc ghi nhận nhân viên đến làm việc với thông
tin thích hợp.
Bạn hãy giúp công ty thiết kế ứng dụng để ghi nhận thời gian
nhân viên tới làm việc.
Ví dụ: Ghi nhận thời gian làm việc
Slide 28 of 28Ver. 1.0
Object-Oriented Programming Using C#
Trong phần này, chúng ta đã học:
Delegates cho phép chúng ta ghi mã và có thể thay đổi linh hoạt
phương thức mà nó gọi.
Có hai kiểu delegates: Single-cast delegate và Multicast delegate.
Một single-cast delegate chỉ có thể gọi một phương thức.
Multicast delegate giữ tham chiếu nhiều hơn một phương thức.
Single-cast delegate dẫn xuất từ lớp System.Delegate và
Multicast delegate dẫn xuất từ lớp System.MulticastDelegate.
Events là thông điệp được gửi bởi một đối tượng để chỉ ra sự kiện
của một event.
Events sử dụng mô hình publisher và subscriber.
Tổng kết
Slide 29 of 28Ver. 1.0
Object-Oriented Programming Using C#
Một publisher là một đối tượng mà duy trì trạng thái nội tại của
nó.
Một subscriber là một đối tượng mà đăng ký sự quan tâm tới
trong một event.
Tổng kết (tiếp)
Các file đính kèm theo tài liệu này:
- bai_giang_ngon_ngu_lap_trinh_nang_cao_bai_6_uy_quyen_su_kien.pdf