4 Chuyển kiểu do người dùng định nghĩa

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 80 - 83)

Cú pháp khai báo cho toán tử này tương tự như khai báo quá tải toán tử. Toán tử phải là public và static. Đây là một toán tử chuyển kiểu cho phép một đối tượng Gio chuyển kiểu không tường minh thành int:

struct Gio {

public static implicit operator int (Gio tu) {

return this.giatri; }

private int giatri; }

Khi khai báo toán tử chuyển kiểu riêng, chúng ta phải chỉ ra toán tử chuyển kiểu tường minh hay không tường minh bằng cách dùng từ khóa implicit và explicit. Ví dụ, toán tử chuyển kiểu Gio thành int phần trên là không tường minh, nghĩa là trình biên dịch C# có thể sử dụng nó không tường minh:

class ViDu {

80 public static void Main() {

Gio trua = new Gio(12);

ViDu.PhuongThuc(trua); //chuyển kiểu không tường minh từ Gio

sang int } }

Nếu toán tử chuyển kiểu được khai báo explicit, ví dụ trước sẽ gây ra lỗi vì chuyển kiểu tường minh được yêu cầu:

ViDu.PhuongThuc(int)trua);// chuyển kiểu tường minh từ Gio sang int

Khi nào bạn nên khai báo toán tử chuyển kiểu tường minh hay không tường minh? Nếu chuyển kiểu là an toàn, không gây mất thông tin, và không thể tạo ra ngoại lệ bạn có thểđịnh nghĩa nó là chuyển kiểu không tường minh, ngược lại nên khai báo chuyển kiểu tường minh.

81

Chương 6: Sựủy nhiệm, sự kiện và quản lý lỗi Mục đích của chương:

ƒ Gọi phương thức gần giống với con trỏ hàm trong C++.

ƒ Khai báo và sử dụng sự kiện.

ƒ Cơ chế quản lý lỗi, bẫy lỗi trong chương trình.

6. 1 Sự ủy nhiệm (delegate)

Nhiều đoạn mã mà chúng ta đã viết trong các bài tập trước được giảđịnh thực thi tuần tự. Nhưng thỉnh thoảng bạn thấy cần thiết ngắt luồng thực thi hiện tại và thực hiện các nhiệm vụ quan trọng hơn. Lúc nhiệm vụ hoàn thành, chương trình có thể tiếp tục quay lại nơi nó gọi thực thi nhiệm vụ.

Đểđiều khiển các ứng dụng dạng này, CLR phải cung cấp 2 điều: một phương tiện để

chỉ ra có một cái gì đó khẩn cấp đã xảy ra và một điều chỉ ra phương thức nào nên chạy khi nó xảy ra. Đây là mục đích của ủy nhiệm và sự kiện (event).

Khai báo và sử dụng delegate

Một delegate là một con trỏđến một phương thức. Một delegate trông giống và cư xử

như phương thức lúc nó được gọi. Tuy nhiên, khi bạn gọi một delegate, CLR thực thi phương thức mà delegate tham chiếu tới. Bạn có thể thay đổi tham chiếu của delegate một cách tựđộng vì vậy mã để gọi một delegate chạy các phương thức khác nhau mỗi lần nó thực thi.

Khai báo delegate

delegate kiểu_trả_về Tên(danh_sách_tham_số); Sử dụng delegate

using System;

delegate void HamDeGoi(); class ViDu

{ (adsbygoogle = window.adsbygoogle || []).push({});

public void PhuongThuc() {

Console.WriteLine("Phuong thuc"); }

public static void staticMethod() {

Console.WriteLine("Phuong thuc tinh"); }

82

class MainClass

{

static void Main() {

ViDu t = new ViDu();

HamDeGoi hamDelegate;

hamDelegate = t.PhuongThuc;

hamDelegate += ViDu.staticMethod;

hamDelegate += t.PhuongThuc;

hamDelegate += ViDu.staticMethod;

hamDelegate(); } } Sử dụng Delegate như là con trỏ hàm using System; class MainClass {

delegate int Hamdelegate(string s); static void Main(string[] args) {

Hamdelegate del1 = new Hamdelegate(PhuongThuc); Hamdelegate del2 = new Hamdelegate(PhuongThuc2); string str = "Xin Chao";

del1(str); del2(str); }

static int PhuongThuc(string s) {

Console.WriteLine("Phuong Thuc"); return 0;

}

static int PhuongThuc2(string s) {

Console.WriteLine("Phuong Thuc 2"); return 0;

} }

Một phần của tài liệu BÀI GIẢNG TÓM TẮT LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG ppsx (Trang 80 - 83)