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

Bài giảng Lập trình hướng đối tượng: Ủy thác và sự kiện

28 73 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 28
Dung lượng 422,75 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Lập trình hướng đối tượng: Uỷ thác và sự kiện cung cấp cho người học các kiến thức: Cơ chế uỷ thác, kiểu delegate, tạo đối tượng và triệu gọi, ba bước sử dụng event, gửi thông báo event,... Mời các bạn cùng tham khảo.

Trang 1

Uỷ thác và sự kiện

Trang 2

Nội dung

1 Uỷ thác

2 Sự kiện

Trang 3

Uỷ thác

Delegate

Trang 4

Cơ chế Uỷ thác

• Muốn thực thi một phương thức nào đó của một đối tượng nào

đó nhưng người lập trình có thể chưa rõ lúc thiết kế

• Dịch vụ gọi báo thức

• Lúc 2h sáng, gọi số điện thoại 0905xxxxxx để tôi dậy coi đá banh

• Một Button Control trong lập trình Windows Form

• Khi nút được nhấn , gọi hàm Click của Form để hiển thị chữ “Hello World” lên màn hình

• Ví dụ: https://youtu.be/Vw05kQhh4tY?t=1773

• Hàm sẽ được gọi

• Việc hàm đó sẽ làm

Trang 5

Kiểu delegate

• Windows API sử dụng con trỏ hàm để hỗ trợ cơ chế gọi ngược

(callback mechanism)

• Một hàm gọi lại một hàm khác

• Có thể xử lý các sự kiện nhấn chuột, di chuyển chuột,…

• Trong NET, delegate là một đối tượng an toàn kiểu, tham

chiếu đến một hàm khác (hoặc danh sách các hàm) mà có thể được triệu gọi khi cần thiết

• 3 bước sử dụng delegate :

• Định nghĩa

• Tạo đối tượng kiểu delegate, đăng ký hàm xử lý

Trang 6

Định nghĩa

• Cú pháp khai báo nguyên mẫu hàm kèm với từ khoá delegate

• delegate phải giống với nguyên mẫu hàm của các hàm mà nó sẽ trỏ tới

• Kiểu delegate trên có thể trỏ đến bất kỳ hàm nào nhận vào 2 số nguyên và

trả ra một số nguyên

• NET tự động tạo ra một lớp có tên là tên của delegate , và có

3 hàm: Invoke, BeginInvoke và EndInvoke

public delegate int BinaryOp(int x, int y);

Trang 7

Tạo đối tượng và triệu gọi

static int Add( int x, int y) {

Trang 8

Đăng ký và huỷ đăng ký

• Sử dụng toán tử += để đăng ký hàm xử lý

• Biến kiểu delegate có thể nhận nhiều hàm xử lý

• Sử dụng toán tử -= để huỷ đăng ký

// Danh sách chứa các hàm xử lý BinaryOp listOfHandlers;

listOfHandlers += Add;

listOfHandlers += Subtract;

listOfHandlers -= Add;

Trang 9

Ví dụ - giám sát sự thay đổi dữ liệu

• Viết hai lớp:

• PointController - giám sát sự thay đổi dữ liệu của lớp Point Nếu có thay

đổi thì làm gì đó (ví dụ: in thông báo sự thay đổi)

• Point - gửi thông báo (triệu gọi hàm) cho lớp PointController (hoặc các

lớp khác nếu có đăng ký) thông qua kiểu delegate

• Lớp Point có:

• Định nghĩa kiểu delegate mới

• Khai báo biến thành phần kiểu delegate đó

• Tạo hàm trợ giúp để cho phép các lớp, muốn giám sát sự thay đổi dữ liệu của

lớp Point, có thể đăng ký

• Tại những nơi có sự thay đổi dữ liệu, triệu gọi các hàm của các lớp đã đăng ký

Trang 10

Ví dụ - giám sát sự thay đổi dữ liệu

• Lớp PointController có:

• Hàm xử lý khi có sự thay đổi dữ liệu, có nguyên mẫu hàm phù hợp với kiểu

delegate của lớp Point

• Đăng ký hàm trên với lớp Point

Trang 11

public int Y…

public Point( int x, int y)

{

this x = x;

this y = y;

}

// Khai báo kiểu delegate

public delegate void ChangedValueHandler ( int newX, int newY);

// Danh sách chứa các hàm x ử lý

private ChangedValueHandler listOfHandlers;

// Nơi đăng ký nhận hàm xử lý

Trang 14

Point p = new Point (0, 0);

PointController pc = new PointController (p);

p.X = 1;

p.Y = 1;

Console ReadKey();

}

Trang 15

Sự kiện

Event

Trang 16

Sự kiện

• Ứng với mỗi thao tác người dùng sẽ có một sự kiện phát sinh,

chương trình phải đáp ứng cho mỗi sự kiện này

• Dịch vụ gọi báo thức

• Lúc 2h sáng, gọi số điện thoại 0905xxxxxx để tôi dậy coi đá banh

• Một Button Control trong lập trình Windows Form

• Khi nút được nhấn , gọi hàm Click của Form để hiển thị chữ “Hello World” lên màn hình

• Sử dụng cơ chế Uỷ thác để cài đặt

• Một kiểu dữ liệu đặc biệt của delegate

• Khái niệm Publishing và Subcribing

Trang 17

Ba bước sử dụng event

1 Định nghĩa event

2 Đăng ký, huỷ đăng ký

3 Gửi thông báo sự kiện xảy ra

Trang 18

Định nghĩa event

• Hai bước:

• Khi khai báo biến kiểu delegate có kèm từ khoá event , trình

biên dịch sẽ tự động cung cấp:

• Các hàm đăng ký và huỷ đăng ký

• Các biến thành phần kiểu delegate trên (luôn là private)

• Làm đơn giản đi quá trình truyền thông báo cho các đối tượng

// Vẫn khai báo kiểu delegate

public delegate void ChangedValueHandler ( int newX, int newY);

// Vẫn khai báo biến event kiểu delegate trên

public event ChangedValueHandler ChangedValueEvent;

Trang 19

Đăng ký và huỷ đăng ký

• Sử dụng toán tử += để đăng ký

• Sử dụng toán tử -= để huỷ đăng ký

static void ChangedValue( int newX, int newY) {

}

ChangedValueEvent += ChangedValue;

ChangedValueEvent -= ChangedValue;

Trang 20

Gửi thông báo event

class Point

{ int x;

public int X {

get { return x; } set

{

x = value ;

if (ChangedValueEvent != null ) ChangedValueEvent.Invoke( value , y);

} }

Trang 21

Ví dụ - giám sát sự thay đổi dữ liệu

• Lớp Point có:

• Định nghĩa kiểu delegate mới

• Định nghĩa event mới thuộc kiểu delegate trên

• Tại những nơi có sự thay đổi dữ liệu, gửi thông báo bằng cách gọi event và

truyền các tham số cần thiết

• Lớp PointController có:

• Hàm xử lý khi có sự thay đổi dữ liệu, có nguyên mẫu hàm phù hợp với kiểu

delegate của lớp Point

• Đăng ký hàm trên với lớp Point

Trang 22

public int Y…

public Point( int x, int y)

{

this x = x;

this y = y;

Trang 24

Point p = new Point (0, 0);

PointController pc = new PointController (p);

p.X = 1;

p.Y = 1;

Console ReadKey();

}

Trang 25

Sử dụng toán tử kiểm tra null

• Sử dụng toán tử kiểm tra null

public int X {

get { return x; } set

{

x = value ; // kiểm tra khác null trước khi truyền thông báo

if (ChangedValueEvent != null ) ChangedValueEvent( value , y); // truyền thông báo

} }

public int X {

get { return x; } set

{

Trang 26

Tuỳ biến đối số dòng lệnh của event

• Khi gửi thông báo, các tham số cần truyền là vấn đề lớn cần xử

• Theo mẫu thiết kế sự kiện (event pattern) của Microsoft, nên:

• Tạo lớp mới, thừa kế từ lớp System EventArgs

• Lớp này gói tất cả các tham số cần truyền lại

class PointEventArgs : System EventArgs

{ public readonly int X;

public readonly int Y;

public PointEventArgs( int x, int y)

Trang 27

Những thay đổi

• Định nghĩa event

• Gửi thông báo sự kiện xảy ra

// Khai báo kiểu delegate

public delegate void ChangedValueHandler ( object sender, PointEventArgs e);

// Khai báo biến event kiểu delegate trên

public event ChangedValueHandler ChangedValueEvent;

ChangedValueEvent( this , new PointEventArgs (x, y));

Trang 28

Cảm ơn sự chú ý

Câu hỏi ?

Ngày đăng: 14/10/2020, 22:32

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm