Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 16 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
16
Dung lượng
188,49 KB
Nội dung
[1]; thePair[1] = temp;
}
}
// yêu cầu hai đối tượng đưa ra giá trị của nó
public override string ToString()
{
return thePair[0].ToString() + “, ”+ thePair[1].ToString();
}
// mảng lưu 2 đố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;
}
// sắp 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;
}
/
/ sắp theo thứ tự chữ cái
public static comparison WhichStudentComesFirst( Object o1, Object o2)
{
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return (String.Compare( s1.name, s2.name) <0 ?
comparison.theFirstComesFirst :
comparison.theSecondComesFirst);
}
public override string ToString()
{
return name;
}
// biến lưu tên
private string name;
}
public class Test
{
public static void Main()
{
// tạo ra hai đối tượng Student và Cat
// đưa chúng vào hai đối tượng Pair Student
Thao = new Student(“Thao”); Student
Ba = new Student(“Ba”);
Cat Mun = new Cat(5); Cat
Ngao = new Cat(2);
Pair studentPair = new Pair(Thao, Ba); Pair
catPair = new Pair(Mun, Ngao);
Console.WriteLine(“Sinh vien \t\t\t: {0}”, studentPair.ToString());
Console.WriteLine(“Meo \t\t\t: {0}”, catPair.ToString());
// tạo ủy quyền
Pair.WhichIsFirst theStudentDelegate = new
Pair.WhichIsFirst( Student.WhichStudentComesFirst);
Pair.WhichIsFirst theCatDelegate = new
Pair.WhichIsFirst( Cat.WhichCatComesFirst);
// sắp xếp dùng ủy quyền studentPair.Sort(
theStudentDelegate);
Console.WriteLine(“Sau khi sap xep studentPair\t\t:{0}”,
studentPair.ToString());
studentPair.ReverseSort(theStudentDelegate);
Console.WriteLine(“Sau khi sap xep nguoc
studentPair\t\t:{0}”, studentPair.ToString());
catPair.Sort( theCatDelegate);
Console.WriteLine(“Sau khi sap xep
catPair\t\t:{0}”, catPair.ToString());
catPair.ReverseSort(theCatDelegate);
Console.WriteLine(“Sau khi sap xep nguoc
catPair\t\t:{0}”, catPair.ToString());
}
}
}
Kết quả:
Sinh vien : Thao, Ba
Meo : 5, 2
Sau khi sap xep studentPair : Ba, Thao
Sau khi sap xep nguoc studentPair : Thao, Ba
Sau khi sap xep catPair : 2, 5
Sau khi sap xep nguoc catPair : 5, 2
Trong đoạn chương trình thử nghiệm trên chúng ta tạo ra hai đối tượng Student và
hai đối tượng Cat sau đó đưa chúng vào hai đối tượng chứa Pair theo từng loại. Bộ
khởi dựng của lớp Student lấy một chuỗi đại diện cho tên của sinh viên và bộ khởi
dựng của lớp Cat thì lấy một số int đại diện cho trọng lượng của mèo.
Student Thao = new Student(“Thao”);
Student Ba = new Student(“Ba”);
Cat Mun = new Cat(“5”);
Cat Ngao = new Cat(“2”);
Pair studentPair = new Pair(Thao, Ba);
Pair catPair = new Pair(Mun, Ngao);
Console.WriteLine(“Sinh vien \t\t\t: {0}”,
studentPair.ToString()); Console.WriteLine(“Meo \t\t\t: {0}”,
catPair.ToString());
Sau đó chương trình in nội dung chứa bên trong của hai đối tượng chứa Pair, và chúng
ta có
thể thấy thứ tự như sau:
Sinh vien : Thao, Ba
Meo : 5, 2
Thứ tự xuất hiện của nó chính là thứ tự đưa vào. Tiếp theo chúng ta khởi tạo hai đối
tượng ủy quyền:
Pair.WhichIsFirst theStudentDelegate = new
Pair.WhichIsFirst(
Student.WhichStudentComesFirst); Pair.WhichIsFirst
theCatDelegate = new
Pair.WhichIsFirst( Student.WhichCatComesFirst);
Ủ y quyền đầu tiên theStudentDelegate được tạo ra bằng cách truyền vào một
phương thức tĩnh tương ứng của lớp Student. Đối tượng ủy quyền thứ hai,
theCatDelegate được một phương thức tĩnh của lớp Cat.
Bây giờ ta đã có các đố
i tượng ủy quyền, chúng ta truyền ủy quyền đầu tiên cho
phương thức Sort của đối tượng Pair, và sau đó là phương thức ReverseSort. Kết quả
được xuất ra màn hình:
Sau khi sap xep studentPair : Ba, Thao
Sau khi sap xep nguoc studentPair : Thao, Ba
Sau khi sap xep catPair : 2, 5
Sau khi sap xep nguoc catPair : 5, 2
Ủ y quyền tĩnh
Như chúng ta đã thấy trong ví dụ minh hoạ 11.1 trước thì hai thể hiện phương thức
ủy quyền được khai báo bên trong lớp gọi (chính xác là trong hàm Main của Test). Điều
này có thể không cần thiế
t ta có thể sử dụng khai báo ủy quyền tĩnh từ hai lớp Student
và Cat. Do vậy ta có thể bổ sung lớp Student bằng cách thêm vào:
public static readonly Pair.WhichIsFirst OrderStudents =
new Pair.WhichIsFirst(Student.WhichStudentComesFirst);
Ý nghĩa của lệnh trên là tạo một ủy quyền tĩnh tên là OrderStudents và có thuộc tính chỉ
đọc
readonly. Việc thêm vào thuộc tính readonly để ghi chú rằng một khi trường đã được
tạo ra
thì không được bổ sung sau đó.
Tương tự như vậy chúng ta có thể tạo ủy quyền tĩ
nh cho Cat như sau:
public static readonly Pair.WhichIsFirst OderCats =
new Pair.WhichIsFirst( Cat.WhichCatComesFirst);
Bây giờ thì đã có hai trường tĩnh hiện diện bên trong các lớp Student và Cat, mỗi cái sẽ
gắn
với phương thức tương ứng bên trong lớp. Sau đó chúng ta có thể thực hiện ủy
quyền mà không cần khai báo thể hiện ủy quyền cục bộ. Việc chuyển ủy quyền
được thực hiện trong lệnh in đậm như sau:
studentPair.Sort( theStudentDelegate);
Console.WriteLine(“Sau khi sap xep studentPair\t\t:{0}”, studentPair.ToString());
studentPair.ReverseSort(Student.OrderStudents);
Console.WriteLine(“Sau khi sap xep nguoc studentPair\t\t:{0}”,
studentPair.ToString());
catPair.Sort( theCatDelegate);
Console.WriteLine(“Sau khi sap xep catPair\t\t:{0}”, catPair.ToString());
catPair.ReverseSort(Cat.OrderCats);
Console.WriteLine(“Sau khi sap xep nguoc catPair\t\t:{0}”, catPair.ToString());
Kết quả thực hiện tương tự như trong ví dụ 11.1
Sử dụng ủy quyền như thuộc tính
Đối với ủy quyền tĩnh thì chúng bắt buộc phải được tạo thể hiện, do tính chất
tĩnh, mà không cần biết là chúng có được sử dụng hay không, như lớp Student và Cat
trong ví dụ bên trên. Chúng ta có thể phát triển những lớp này tốt h
ơn bằng cách
thay thế ủy quyền tĩnh từ trường thành thuộc tính.
Với lớp Student ta có thể chuyển khai báo:
public static readonly Pair.WhichIsFirst OrderStudent =
new Pair.WhichIsFirst( Student.WhichStudentComesFirst);
thành khai báo như sau:
public static Pair.WhichIsFirst OrderStudents
{
get
{
return new Pair.WhichIsFirst( WhichStudentComesFirst);
}
}
Tương tự như vậy chúng ta thực hiện thay thế với lớp Cat:
public static Pair.WhichIsFirst OderCats
{
get
{
return new Pair.WhichIsFirst( WhichCatComesFirst);
}
}
Khi truyền cho phương thức thì không thay
đổi: studentPair.Sort(
Student.OderStudents); catPair.Sort(
Cat.OrderCats);
Khi thuộc tính OrderStudents được truy cập thì ủy quyền được tạo ra:
return new Pair.WhichIsFirst( WhichCatComesFirst);
Điều quan trọng ở đây là ủy quyền sẽ không được tạo cho đến khi nào nó được yêu
cầu. Việc này cho phép lớp gọi (như lớp Test) quyết định khi nào cần thiết sử
dụng một ủy quyền nhưng vẫn cho phép việc tạo ủy quyền là trách nhiệm của lớp
Student hay lớp Cat.
Thiết lập thứ tự thi hành với mảng ủy quy
ền
Ủ y quyền có thể giúp chúng ta tạo ra một hệ thống trong đó người sử dụng có
thể quyết định đến thứ tự của các hoạt động khi thực thi. Giả sử chúng ta có một hệ
thống xử lý ảnh trong đó các ảnh có thể được thao tác bởi một phương pháp được
định nghĩa tốt như là: làm mờ, làm đậm, xoay, lọc ảnh, Giả sử rằng, thứ t
ự khi sử
dụng các hiệu ứng này được áp dụng cho ảnh là quan trọng. Người sử dụng muốn lựa
chọn những hiệu ứng này từ menu, anh ta chọn tất cả các hiệu ứng tùy thích, và sau
đó yêu cầu bộ xứ lý ảnh thực hiện lần lượt các hiệu ứng mà anh ta đã xác định.
Chúng ta có thể tạo những ủy quyền cho mỗi hoạt động và sau đó thêm chúng vào một
tập hợ
p được sắp, như là một mảng chẳng hạn, theo một thứ tự mà ta muốn chúng thực
thi. Một
khi tất cả các ủy quyền được tạo ra và đưa vào tập hợp, chúng ta dễ dàng lặp lần lượt
qua các thành phần của mảng, và thực thi lần lượt từng phương thức ủy quyền.
Chúng ta bắt đầu bằng việc xây dựng một lớp Image thể hiện một ảnh s
ẽ được xử lý bởi
lớp
ImageProcessor:
public class Image
{
public Image()
{
Console.WriteLine(“An image created”);
}
}
Chúng ta có thể tưởng tượng rằng việc xuất ra chuỗi như vậy tương ứng với việc tạo
một ảnh .gif hay .jpeg hay đại loại như vậy.
Sau đó lớp ImageProcessor khai báo một ủy quyền. Dĩ nhiên là chúng ta có thể định
nghĩa một ủy quyền riêng trả về bất cứ kiểu dữ liệu nào hay lấy bất cứ tham số nào
mà chúng ta muốn. Trong ví dụ này chúng ta định nghĩa m
ột ủy quyền có thể đóng
gói bất cứ phương thức không có giá trị trả về và cũng không nhận bất cứ tham số nào
hết:
public delegate void DoEffect();
Tiếp tục lớp ImageProcessor khai báo một sô phương thức, và từng phương thức này
phù hợp với ký pháp và kiểu trả về được khai báo bởi ủy quyền:
public static void Blur()
[...]... thao tác diễn ra trong quá trình tương tác ở thành phần giao diện người sử dụng Trong ví dụ này chúng ta mô phỏng bằng cách chọn các hiệu ứng, thêm chúng vào trong mảng, và ProcessImage Ví dụ minh họa 11 .2: Sử dụng mảng ủy quyền namespace Programming_CSharp { using System; // khai báo lớp ảnh public class Image { public Image() { Console.WriteLine(“An image created”); . WhichCatComesFirst(Object o1, Object o2)
{
Cat c1 = (Cat) o1;
Cat c2 = (Cat) o2;
return c1.weight > c2.weight ?
comparison.theSecondComesFirst. WhichStudentComesFirst( Object o1, Object o2)
{
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return (String.Compare( s1.name, s2.name) <0 ?
comparison.theFirstComesFirst