Bài giảng Ngôn ngữ lập trình nâng cao - Bài 5 - Lý Anh Tuấn

Trong phần này, chúng ta sẽ học:

Cơ chế ủy quyền(delegate)

Cơ chế multicast delegate

Sử dụng event với delegate

 

pdf36 trang | Chuyên mục: Visual C# | Chia sẻ: yen2110 | Lượt xem: 280 | Lượt tải: 2download
Tóm tắt nội dung Bài giảng Ngôn ngữ lập trình nâng cao - Bài 5 - Lý Anh Tuấn, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
){
num *= q;
return num;
}
public static int getNum(){
return num;
}
Sử dụng Delegate (tiếp)
Slide 10 of 28Ver. 1.0
Object-Oriented Programming Using C#
static void Main(string[] args){
//tao cac doi tuong delegate
NumberChanger nc1 = new NumberChanger(AddNum); 
NumberChanger nc2 = new NumberChanger(MultNum);
//goi cac phuong thuc boi su dung cac doi tuong
delegate
nc1(25);
Console.WriteLine("Gia tri la: {0}", getNum());
nc2(5);
Console.WriteLine("Gia tri la: {0}", getNum());
Console.ReadKey();
}
}
}
Sử dụng Delegate (tiếp)
Slide 11 of 28Ver. 1.0
Object-Oriented Programming Using C#
Ví dụ 2:
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
public delegate void PrintData(String s);
Sử dụng Delegate (tiếp)
Slide 12 of 28Ver. 1.0
Object-Oriented Programming Using C#
//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)
{
//Khởi tạo đối tượng stream
FStream = new FileStream("D:\\StoreData.txt", 
FileMode.Append, FileAccess.Write);
SWriter = new StreamWriter(FStream);
s = s + " File";
//Ghi chuỗi xuống file
SWriter.WriteLine(s);
Sử dụng Delegate (tiếp)
Slide 13 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 static void DisplayData(PrintData 
PMethod)
{
PMethod("This should go to the");
}
Sử dụng Delegate (tiếp)
Slide 14 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 15 of 28Ver. 1.0
Object-Oriented Programming Using C#
Có hai kiểu delegate và phụ thuộc vào yêu cầu
của ứng dụng để lựa chọn kiểu delegate phù hợp.
Hai kiểu delegate:
Single-cast delegate
Multicast delegate
Các kiểu Delegates
Slide 16 of 28Ver. 1.0
Object-Oriented Programming Using C#
Single-cast delegate dẫn xuất từ lớp
System.Delegate.
Nó chứa tham chiếu tới duy nhất một phương
thức tại một thời điểm.
Single-Cast Delegate
Slide 17 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 lời gọi của một 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 delegate 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ẽ
thực thi 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ị. Các phương thức được gọi liên
tiếp và chúng ta không thể đợi giá trị trả về từ mỗi phương
thức.
Slide 18 of 28Ver. 1.0
Object-Oriented Programming Using C#
Ví dụ 1:
using System;
delegate int NumberChanger(int n);
namespace DelegateCsharp
{
class TestCsharp{
static int num = 10;
public static int AddNum(int p){
num += p;
return num;
}
public static int MultNum(int q){
num *= q;
return num;
}
public static int getNum(){
return num;
}
Multicast Delegate
Slide 19 of 28Ver. 1.0
Object-Oriented Programming Using C#
static void Main(string[] args){
//tao cac doi tuong delegate
NumberChanger nc1 = new NumberChanger(AddNum); 
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
//goi multicast
nc(5);
Console.WriteLine("Gia tri la: {0}", getNum());
Console.ReadKey();
}
}
}
Multicast Delegate
Slide 20 of 28Ver. 1.0
Object-Oriented Programming Using C#
Ví dụ 2: 
using System;
namespace DelegateDemo
{
public delegate void MyEventHandler(string msg);
public class Demo
{
public static void Main()
{
Demo d = new Demo();
MyEventHandler handler1 = new MyEventHandler(d.DisplayMsg);
MyEventHandler handler2 = new MyEventHandler(d.ShowHello);
MyEventHandler handler = handler1 + handler2;
handler("Test");
Console.ReadLine();
}
Multicast Delegate
Slide 21 of 28Ver. 1.0
Object-Oriented Programming Using C#
public void DisplayMsg(string msg)
{
Console.WriteLine(msg);
}
public void ShowHello(string name)
{
Console.WriteLine("Hello " + name);
}
}
}
Ví dụ 2: Multicast Delegate
Slide 22 of 28Ver. 1.0
Object-Oriented Programming Using C#
Câu hỏi
Câu lệnh sau là đúng hay sai?
Multicast delegate kế thừa từ lớp 
System.Delegate.MulticastDelegate.
Trả lời:
Sai
Slide 23 of 28Ver. 1.0
Object-Oriented Programming Using C#
Làm việc với Event
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. 
Ứng dụng có thể đáp ứng các event khi chúng
xảy ra.
Slide 24 of 28Ver. 1.0
Object-Oriented Programming Using C#
Làm việc với Event (tiếp) 
Hình sau chỉ ra sự kiện đồng hồ và xử lý sự kiện.
Đồng hồ chỉ 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 25 of 28Ver. 1.0
Object-Oriented Programming Using C#
Sử dụng Delegate với Event 
Event đượ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. 
Event là một phần của class và class này đượ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 event này 
hoặc có thể tập hợp những event này. 
Event 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 26 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 27 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 28 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 29 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à 
RingAlarm:
Student PD= new Student();
RingAlarm += new TimeToRise(PD.WakeUp);
Sử dụng Delegates với Events (tiếp)
Slide 30 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 Delegate với Event (tiếp)
Slide 31 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 32 of 28Ver. 1.0
Object-Oriented Programming Using C#
Slide 33 of 28Ver. 1.0
Object-Oriented Programming Using C#
Slide 34 of 28Ver. 1.0
Object-Oriented Programming Using C#
Slide 35 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 36 of 28Ver. 1.0
Object-Oriented Programming Using C#
Trong phần này, chúng ta đã học:
Delegate 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 delegate: 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.
Event 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.
Event sử dụng mô hình publisher và subscriber.
Tổng kết

File đính kèm:

  • pdfbai_giang_ngon_ngu_lap_trinh_nang_cao_bai_5_ly_anh_tuan.pdf
Tài liệu liên quan