Phương thức này lấy một tham số: một ủy quyền có kiểu WhichIsFirst với tên là theDelegateFunc. Phương thức Sort giao phó trách nhiệm quyết định thứ tự đến trước sau của hai đối tượng bên trong Pair đến phương thức được đóng gói bởi ủy quyền. Bên trong thân của Sort, phương thức ủy quyền được gọi và trả về một giá trị, giá trị này là một trong hai giá trị liệt kê của comparison.
Ngơn Ngữ Lập Trình C# object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } Phương thức lấy tham số: ủy quyền có kiểu WhichIsFirst với tên theDelegateFunc Phương thức Sort giao phó trách nhiệm định thứ tự đến trước sau hai đối tượng bên Pair đến phương thức đóng gói ủy quyền Bên thân Sort, phương thức ủy quyền gọi trả giá trị, giá trị hai giá trị liệt kê comparison Nếu giá trị trả theSecondComesFirst, đối tượng bên Pair hoán đổi vị trí, trường hợp ngược lại khơng làm Hãy tưởng tượng xếp Student theo tên Chúng ta viết phương thức trả theFirstComesFirst tên sinh viên đến trước theSecondComesFirst tên sinh viên thứ hai đến trước Nếu đưa vào “Amy, Beth” phương thức trả kết theFirstComesFirst Và ngược lại truyền “Beth, Amy” kết trả theSecondComesFirst Khi nhận kết theSecondComesFirst, phương thức Sort đảo hai đối tượng mảng, thiết lập Amy vị trí đầu cịn Beth vị trí thứ hai Tiếp theo thêm phương thức ReverseSort, phương thức đặt mục mảng theo thứ tự đảo ngược lại: public void ReverseSort( WhichIsFirst theDeleagteFunc) { if ( theDelegateFunc( thePair[0], thePair[1]) == comparison.theFirstComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } Việc thực tương tự phương thức Sort Tuy nhiên, phương thức thực việc hoán đổi phương thức ủy quyền xác định đối tượng trước tới trước Do vậy, kết thực phương thức đối tượng thứ hai đến trước Lúc truyền vào “Amy, Beth”, phương thức ủy quyền trả theFirstComesFirst, phương thức ReverseSort hốn đổi vị trí hai đối tượng này, thiết lập Beth đến trước Điều cho phép sử dụng phương thức ủy quyền tương tự Sort, mà không cần yêu cầu đối tượng hỗ trợ phương thức trả giá trị ngược 308 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# Lúc điều cần thiết tạo vài đối tượng để xếp Ta tạo hai lớp đối tượng đơn giản sau: lớp đối tượng Student lớp đối tượng Cat Gán cho đối tượng Student tên vào lúc tạo: public class Student { public Student (string name) { this.name = name; } } Lớp đối tượng Student yêu cầu hai phương thức, phương thức phủ ToString (), phương thức khác đóng gói phương thức ủy quyền Lớp Student phải phủ phương thức ToString() phương thức ToString() lớp Pair sử dụng cách xác Việc thực thi khơng có phức tạp mà đơn trả tên sinh viên: public override string ToString() { return name; } phải thực thi phương thức hỗ trợ cho Pair.Sort() ủy quyền xác định thứ tự hai đối tượng xem đối tượng đến trước: Student public static comparison WhichStudentComesFirst(Object o1, Object o2) { Student s1 = (Student) o1; Student s2 = (Student) o2; return ( String.Compare( s1.name, s2.name) c2.weight ? theSecondComesFirst : theFirstComesFirst; } public override string ToString() { return weight.ToString(); } // biến lưu giữ trọng lượng private int weight; } Cũng tương tự lớp Student lớp Cat phủ phương thức ToString() thực thi phương thức tĩnh với cú pháp tương ứng với phương thức ủy quyền Và lưu ý phương thức ủy quyền Student Cat không tên với Chúng ta không cần thiết phải làm tên gán đến phương thức ủy quyền lúc thực thi Ví dụ minh họa 11.1 sau trình bày cách phương thức ủy quyền gọi Ví dụ 11.1: Làm việc với ủy quyền namespace Programming_CSharp { using System; // khai báo kiểu liệt kê public enum comparison { theFirstComesFirst =1, 310 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# theSecondComesFirst = } // lớp Pair đơn giản lưu giữ đối tượng public class Pair { // khai báo ủy quyền public delegate comparison WhichIsFirst( object obj1, object obj2); // truyền hai đối tượng vào khởi dựng public Pair( object firstObject, object secondObject) { thePair[0] = firstObject; thePair[1] = secondObject; } // phương thức xếp thứ tự hai đối tượng // theo tiêu chuẩn đối tượng public void Sort( WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theSecondComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } // phương thức xếp hai đối tượng theo // thứ tự nghịch đảo lại tiêu chuẩn xếp public void ReverseSort( WhichIsFirst theDelegateFunc) { if (theDelegateFunc( thePair[0], thePair[1]) == comparison.theFirstComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } // yêu cầu hai đối tượng đưa giá trị 311 Cơ Chế Ủy Quyền - Sự Kiện Ngơn Ngữ Lập Trình C# public override string ToString() { return thePair[0].ToString() + “, ”+ thePair[1].ToString(); } // mảng lưu đối tượng private object[] thePair = new object[2]; } //lớp đối tượng Cat public class Cat { public Cat(int weight) { this.weight = weight; } // theo thứ tự trọng lượng public static comparison WhichCatComesFirst(Object o1, Object o2) { Cat c1 = (Cat) o1; Cat c2 = (Cat) o2; return c1.weight > c2.weight ? comparison.theSecondComesFirst : comparison.theFirstComesFirst; } public override string ToString() { return weight.ToString(); } // biến lưu trọng lượng private int weight; } // khai báo lớp Student public class Student { public Student( string name) { this.name = name; } // theo thứ tự chữ 312 Cơ Chế Ủy Quyền - Sự Kiện ... Lớp đối tượng Student yêu cầu hai phương thức, phương thức phủ ToString (), phương thức khác đóng gói phương thức ủy quy? ??n Lớp Student phải phủ phương thức ToString( ) phương thức ToString( ) lớp. .. comparison.theSecondComesFirst); } phương thức NET lớp String, phương thức so sánh hai chuỗi trả giá trị nhỏ chuỗi nhỏ chuỗi thứ hai lớn chuỗi thứ hai nhỏ hơn, giá trị hai chuỗi Phương thức trình bày chương 10 chuỗi Theo... ứng với phương thức ủy quy? ??n Và lưu ý phương thức ủy quy? ??n Student Cat không tên với Chúng ta không cần thiết phải làm tên gán đến phương thức ủy quy? ??n lúc thực thi Ví dụ minh họa 11.1 sau trình