Tải bản đầy đủ (.ppt) (50 trang)

P4 - Delegate & event docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (351.96 KB, 50 trang )

Cơ chế Delegate & Event
HD: ThS Nguyễn Hà Giang
HD: ThS Nguyễn Hà Giang
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Nội dung
Delegate
Delegate
Khái niệm delegate
Khái niệm delegate
Thực thi delegate
Thực thi delegate
Multicast delegate
Multicast delegate
Giải pháp cho hàm Sort tổng quát
Giải pháp cho hàm Sort tổng quát
Event
Event
Khái niệm event
Khái niệm event
Event & delegate
Event & delegate
Cơ chế publishing & subscribing
Cơ chế publishing & subscribing
Minh họa cơ chế event
Minh họa cơ chế event
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Delegate
Lớp đóng gói các phương thức (method signature)
Lớp đóng gói các phương thức (method signature)


Dùng trong event-handling model của C#
Dùng trong event-handling model của C#
Đặc tính
Đặc tính
Type safe
Type safe
Object oriented mechanism
Object oriented mechanism
Delegate là class:
Delegate là class:
Có instance
Có instance
Có thể chứa những tham chiếu đến 1 hay
Có thể chứa những tham chiếu đến 1 hay
nhiều method
nhiều method
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Delegate
Một delegate định nghĩa một signature
Một delegate định nghĩa một signature
Return type
Return type
Sequence of parameter types
Sequence of parameter types
Tất cả các method có cùng signature có thể được
Tất cả các method có cùng signature có thể được
add vào thể hiện của delegate
add vào thể hiện của delegate
Delegate instance có một danh sách các tham chiếu

Delegate instance có một danh sách các tham chiếu
method
method
Cho phép add (+) các method
Cho phép add (+) các method
Có thể remove (-) các method
Có thể remove (-) các method
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Define delegate
public delegate void
public delegate void
MyDelegate1
MyDelegate1
(int x, int y)
(int x, int y)
Delegate cho dạng hàm:
Delegate cho dạng hàm:
void Method( int, int )
void Method( int, int )
public delegate string
public delegate string
MyDelegate2
MyDelegate2
(float f)
(float f)
Delegate cho dạng hàm:
Delegate cho dạng hàm:
string Method( float )
string Method( float )

Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Instance delegate
public void Method1(int x, int y)
public void Method1(int x, int y)
{
{


}
}


MyDelegate1 del1 = new
MyDelegate1 del1 = new
MyDelegate1
MyDelegate1
(Method1);
(Method1);
public string Method2(float f)
public string Method2(float f)
{
{


}
}


MyDelegate2 del2 = new

MyDelegate2 del2 = new
MyDelegate2
MyDelegate2
(Method2);
(Method2);
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Call Delegate
int x = 5, y = 10;
int x = 5, y = 10;
del1(x, y);
del1(x, y);
del1(10, 20);
del1(10, 20);
int y = 2;
int y = 2;
del1(100, y);
del1(100, y);
Gọi del1
Gọi del1
float f =0.5f;
float f =0.5f;
string s;
string s;
s = del2(f);
s = del2(f);
string s = del2(100f);
string s = del2(100f);
Gọi del2
Gọi del2

Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Multi Cast
void Print(int x,int y) {
void Print(int x,int y) {
Console.WriteLine(“x = {0}, y = {1}”, x, y);
Console.WriteLine(“x = {0}, y = {1}”, x, y);
}
}
void Sum(int x, int y) {
void Sum(int x, int y) {
Console.WriteLine(“Tong = {0}”, x+y);
Console.WriteLine(“Tong = {0}”, x+y);
}
}
MyDelegate1 mulDel = new MyDelegate1(Print);
MyDelegate1 mulDel = new MyDelegate1(Print);
mulDel += new MyDelegate1(Sum);
mulDel += new MyDelegate1(Sum);
mulDel(5, 10);
mulDel(5, 10);
mulDel -= new MyDelegate1(Print);
mulDel -= new MyDelegate1(Print);
mulDel(5,10);
mulDel(5,10);
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Problem

Xây dựng hàm Sort
Xây dựng hàm Sort
tổng quát cho cho
tổng quát cho cho
mảng đối tượng có
mảng đối tượng có
kiểu bất kỳ
kiểu bất kỳ
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Solution
Phân tích
Phân tích
Nếu đối tượng là kiểu số như int, long,
Nếu đối tượng là kiểu số như int, long,
float thì ko có vấn đề
float thì ko có vấn đề
Trường hợp đối tượng phức khác?
Trường hợp đối tượng phức khác?
So sánh theo
So sánh theo
quy tắc nào
quy tắc nào
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Solution
Giải pháp:
Giải pháp:
Cho phép đối tượng tự quy định thứ tự
Cho phép đối tượng tự quy định thứ tự

của chúng
của chúng
Sử dụng delegate để truyền phương thức
Sử dụng delegate để truyền phương thức
so sánh này vào hàm Sort
so sánh này vào hàm Sort
void Sort(object[] list, CompareObj cmp)
void Sort(object[] list, CompareObj cmp)
Delegate này sẽ tham chiếu tới hàm Compare
Delegate này sẽ tham chiếu tới hàm Compare
của lớp MyClass. Chính lớp MyClass sẽ quy
của lớp MyClass. Chính lớp MyClass sẽ quy
định thứ tự của các đối tượng
định thứ tự của các đối tượng
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Solution
Mô tả delegate CompareObj cho hàm Sort:
Mô tả delegate CompareObj cho hàm Sort:
public delegate
public delegate
bool
bool


CompareObj
CompareObj
(
(
object

object
o1,
o1,
object
object
o2)
o2)
Trả về true: nếu o1 “trước” o2
Trả về true: nếu o1 “trước” o2
false: ngược lại
false: ngược lại
2 đối tượng cần so sánh
2 đối tượng cần so sánh
Tên của delegate
Tên của delegate
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Solution


public static void Sort(object[] objs, CompareObj
public static void Sort(object[] objs, CompareObj
cmp
cmp
)
)


{
{



for(int i=0; i < objs.Length-1;
for(int i=0; i < objs.Length-1;


i++)
i++)


for(int j=objs.Length-1; j>i;
for(int j=objs.Length-1; j>i;


j )
j )


if (
if (


cmp
cmp
(
(


objs[j],
objs[j],



objs[j-1]
objs[j-1]


)
)


)
)


{
{
Swap( objs[j], objs[j-1] );
Swap( objs[j], objs[j-1] );


}
}


}
}
Định nghĩa hàm Sort tổng
Định nghĩa hàm Sort tổng
quát cho các lớp
quát cho các lớp

Delegate sẽ trỏ tới hàm
Delegate sẽ trỏ tới hàm
Compare riêng của lớp
Compare riêng của lớp
tương ứng
tương ứng
Yêu cầu lớp tự
Yêu cầu lớp tự
so sánh
so sánh
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Solution
Các lớp hỗ trợ Sort thì phải
Các lớp hỗ trợ Sort thì phải
Cung cấp hàm Compare riêng
Cung cấp hàm Compare riêng
Signature phải thoả delegate CompareObj
Signature phải thoả delegate CompareObj
Cùng
Cùng
signature
signature
class Person
class Person


{
{



private string name;
private string name;


private int weight;
private int weight;


private int yearOfBirth;
private int yearOfBirth;


public static bool
public static bool
CompareName
CompareName
(object p1, object p2)
(object p1, object p2)


{
{


if (string.Compare(((Person)p1).name, ((Person)p2).name)<0)
if (string.Compare(((Person)p1).name, ((Person)p2).name)<0)


return true;

return true;


return false;
return false;


}
}
}
}
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Solution




public delegate bool
public delegate bool
CompareObj
CompareObj
(object o1,object o2);
(object o1,object o2);




Person[
Person[



]
]
persons
persons
= new Person[4];
= new Person[4];


persons[0] = new Person(“
persons[0] = new Person(“
Quy
Quy


Mui
Mui
",
",


2,
2,


2004);
2004);



persons[1] = new Person(“
persons[1] = new Person(“
Ha
Ha


Giang
Giang
",
",


65,
65,


1978);
1978);


persons[2] = new Person(“
persons[2] = new Person(“
Ngoc
Ngoc


Thao
Thao
",
",



47, 1979);
47, 1979);


persons[3] = new Person(“
persons[3] = new Person(“
Ha
Ha


Nam
Nam
",
",


65,
65,


1932);
1932);


CompareObj
CompareObj



cmp
cmp
= new
= new
CompareObj
CompareObj
(Person.
(Person.
Compare
Compare
Name
Name
);
);


HaG
HaG
Li
Li
b
b
.Sort(
.Sort(


persons
persons
,
,



cmp
cmp


);
);
Gọi hàm static Sort
Gọi hàm static Sort
Lớp chứa hàm Sort
Lớp chứa hàm Sort
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Event
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Event
Cơ chế thông điệp giữa các lớp hay các đối tượng
Cơ chế thông điệp giữa các lớp hay các đối tượng
Có thể thông báo cho lớp khác biết được khi một
Có thể thông báo cho lớp khác biết được khi một
lớp có phát sinh điều gì đó
lớp có phát sinh điều gì đó
Publisher
Publisher
: lớp phát sinh sự kiện
: lớp phát sinh sự kiện

Subscriber
Subscriber
: lớp nhận hay xử lý khi sự kiện xảy ra
: lớp nhận hay xử lý khi sự kiện xảy ra
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Event
Trong môi trường giao diện GUIs (Graphical User
Trong môi trường giao diện GUIs (Graphical User
Interfaces: GUIs):
Interfaces: GUIs):
Button đưa ra sự kiện “
Button đưa ra sự kiện “
Click
Click
”, cho phép
”, cho phép
lớp khác có thể đáp ứng (xử lý) khi sự
lớp khác có thể đáp ứng (xử lý) khi sự
kiện này xảy ra.
kiện này xảy ra.
VD: Button “
VD: Button “
Add
Add
” trong Form, khi sự kiện click xảy
” trong Form, khi sự kiện click xảy
ra thì Form thực hiện lấy dữ liệu từ các TextBox đưa
ra thì Form thực hiện lấy dữ liệu từ các TextBox đưa
vào ListBox…

vào ListBox…
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Publishing & Subscribing
Một lớp có publish một tập các event cho phép các
Một lớp có publish một tập các event cho phép các
lớp khác subscribe
lớp khác subscribe
Button là lớp publish đưa ra event: click
Button là lớp publish đưa ra event: click
Form là lớp subscribe có phần xử lý riêng
Form là lớp subscribe có phần xử lý riêng
khi “
khi “
click
click
” của Button kích hoạt.
” của Button kích hoạt.
A
A
B
B
C
C
event
event
publish
publish
subscribe
subscribe

T
h
ô
n
g

b
á
o
T
h
ô
n
g

b
á
o
Đ
ă
n
g

k
ý
Đ
ă
n
g


k
ý
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Event & Delegate
Sự kiện trong C# được thực thi nhờ uỷ thác
Sự kiện trong C# được thực thi nhờ uỷ thác
Lớp publishing định nghĩa ủy thác
Lớp publishing định nghĩa ủy thác
Những lớp subscribing phải thực thi
Những lớp subscribing phải thực thi
Khi sự kiện xuất hiện thì phương thức
Khi sự kiện xuất hiện thì phương thức
của lớp subscribing được gọi thông qua
của lớp subscribing được gọi thông qua
uỷ thác.
uỷ thác.
Phương thức để xử lý sự kiện gọi là
Phương thức để xử lý sự kiện gọi là
trình xử lý sự
trình xử lý sự
kiện
kiện
(event handler)
(event handler)
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Event & Delegate
Trình xử lý sự kiện trong .NET Framework được mô
Trình xử lý sự kiện trong .NET Framework được mô

tả như sau:
tả như sau:
Trả về giá trị void
Trả về giá trị void
Tham số 1
Tham số 1
: nguồn phát sinh sự kiện, đây
: nguồn phát sinh sự kiện, đây
chính là đối tượng publisher
chính là đối tượng publisher
Tham số 2
Tham số 2
: là đối tượng thuộc lớp dẫn
: là đối tượng thuộc lớp dẫn
xuất từ EventArgs
xuất từ EventArgs
Phải thực hiện trình xử lý sự kiện theo đúng mẫu
Phải thực hiện trình xử lý sự kiện theo đúng mẫu
trên!
trên!
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Event & Delegate
Khai báo delegate xử lý sự kiện
Khai báo delegate xử lý sự kiện
Khai báo event
Khai báo event
Các lớp muốn xử lý khi sự kiện OnEventName phát
Các lớp muốn xử lý khi sự kiện OnEventName phát
sinh thì phải thực thi event handler

sinh thì phải thực thi event handler
public
public
delegate
delegate
void HandlerName(object obj, EventArgs arg);
void HandlerName(object obj, EventArgs arg);
public
public
event
event
HandlerName OnEventName;
HandlerName OnEventName;
Nguyen Ha Giang - 2008
Nguyen Ha Giang - 2008
Minh họa 1
Xây dựng 1 lớp thực hiện yêu cầu: “
Xây dựng 1 lớp thực hiện yêu cầu: “
cứ mỗi giây sẽ
cứ mỗi giây sẽ
phát sinh 1 sự kiện
phát sinh 1 sự kiện


Cho phép 2 lớp khác đăng ký xử lý sự kiện này, mỗi
Cho phép 2 lớp khác đăng ký xử lý sự kiện này, mỗi
lớp có cách xử lý riêng:
lớp có cách xử lý riêng:
Lớp A
Lớp A

: hiển thị thời gian theo “
: hiển thị thời gian theo “
mô phỏng
mô phỏng
đồng hồ analog
đồng hồ analog


Lớp B
Lớp B
: hiển thị thời gian theo “
: hiển thị thời gian theo “
mô phỏng
mô phỏng
đồng hồ digital
đồng hồ digital


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×