Tài liệu Các giao diện và mẫu phần 2 - Pdf 97

1.1 Hiện thực kiểu khả-so-sánh (comparable type)
V
VBạn cần một cơ chế dùng để so sánh các kiểu tùy biến, cho phép bạn dễ dàng
sắp xếp tập hợp chứa các thể hiện của kiểu này.
#
#Để cung cấp một cơ chế so sánh chuẩn cho một kiểu, hiện thực giao diện
System.IComparable. Để hỗ trợ nhiều dạng so sánh, tạo riêng từng kiểu trợ
giúp (helper) và các kiểu này hiện thực giao diện
System.Collections.IComparer.
Nếu muốn sắp xếp kiểu của bạn chỉ theo một thứ tự nào đó (như ID tăng dần, hay tên
theo thứ tự alphabet), bạn nên hiện thực giao diện IComparable. Giao diện này
định nghĩa
phương thức CompareTo như sau:
int CompareTo(object obj);
Đối tượng (obj) được truyền cho phương thức phải cùng kiểu với đối tượng đang gọi, nếu
không CompareTo sẽ ném ngoại lệ System.ArgumentException. Giá trị do CompareTo
trả về được tính như sau:
• Nếu đối tượng hiện tại nhỏ hơn obj, trả về một số âm (chẳng hạn, -1).
• Nếu đối tượng hiện tại có cùng giá trị
như obj, trả về zero.
• Nếu đối tượng hiện tại lớn hơn obj, trả về một số dương (chẳng hạn, 1).
Phép so sánh này thực hiện điều gì là tùy thuộc vào kiểu đã hiện thực giao diện
IComparable. Ví dụ, nếu muốn sắp xếp dựa theo tên, bạn cần thực hiện phép so sánh
chuỗi (String). Tuy nhiên, nếu muốn sắp xếp dựa theo ngày sinh, bạn cần thực hiện phép
so sánh ngày (System.DateTime).

// Xử lý các tham chiếu null.
// Null được coi như nhỏ hơn bất cứ giá trị nào khác.
if (x == null && y == null) return 0;
else if (x == null) return -1;
else if (y == null) return 1;

// Trường hợp x và y tham chiếu đến cùng một đối tượng.
if (x == y) return 0;

// Bảo đảm x và y đều là các thể hiện của Newspaper.
Newspaper newspaperX = x as Newspaper;
if (newspaperX == null) {

throw new ArgumentException("Invalid object type", "x");
}

Newspaper newspaperY = y as Newspaper;
if (newspaperY == null) {

throw new ArgumentException("Invalid object type", "y");
}

// So sánh circulation. IComparer quy định rằng:
// trả về một số âm nếu x < y
// trả về zero nếu x = y
// trả về một số dương nếu x > y
// Dễ dàng hiện thực logic này bằng phép tính số nguyên.
return newspaperX.circulation - newspaperY.circulation;
}
}

Newspaper other = obj as Newspaper;

// Nếu "other" là null, nó không phải là một thể hiện của
// Newspaper. Trong trường hợp này, CompareTo phải ném
// ngoại lệ System.ArgumentException.
if (other == null) {

throw new ArgumentException("Invalid object type", "obj");

} else {

// Tính giá trị trả về bằng cách thực hiện phép so sánh
// trường name (không phân biệt chữ hoa-thường).

// Vì name là chuỗi nên cách dễ nhất là dựa vào khả năng
// so sánh của lớp String (thực hiện phép so sánh chuỗi
// có phân biệt bản địa).
return string.Compare(this.name, other.name, true);
}
}
}
Phương thức Main minh họa phép so sánh và khả năng sắp xếp nhờ có hiện thực giao
diện IComparable và IComparer. Phương thức này sẽ tạo một tập hợp
System.Collections.ArrayList chứa năm đối tượng Newspaper, sau đó sắp xếp ArrayList
hai lần bằng phương thức ArrayList.Sort. Lần đầu, thao tác Sort sử dụng cơ chế so sánh
mặc định của Newspaper (thông qua phương thức IComparable.CompareTo). Lần sau,
thao tác Sort sử dụng đối tượng AscendingCirculationComparer (thông qua phương thức
IComparer.Compare).
public static void Main() {


Echip: Circulation = 55230
Thanh Nien: Circulation = 235950
Phu Nu: Circulation = 88760
Tiep Thi: Circulation = 5670

Newspaper list sorted by name (default order):
Echip: Circulation = 55230
Phu Nu: Circulation = 88760
Thanh Nien: Circulation = 235950
Tiep Thi: Circulation = 5670
Tuoi Tre: Circulation = 125780

Newspaper list sorted by circulation:
Tiep Thi: Circulation = 5670
Echip: Circulation = 55230
Phu Nu: Circulation = 88760
Tuoi Tre: Circulation = 125780
Thanh Nien: Circulation = 235950
1.2 Hiện thực kiểu khả-liệt-kê (enumerable type)
V
VBạn cần tạo một kiểu tập hợp sao cho nội dung của nó có thể được liệt kê bằng
lệnh foreach.
#
#Hiện thực giao diện System.IEnumerable trong kiểu tập hợp của bạn. Phương


System.InvalidOperationException.
MoveNext
Phương thức này dịch chuyển enumerator sang phần tử dữ
liệu kế tiếp trong tập hợp; trả về true nếu còn phần tử, trả về
false nếu không còn phần tử. Nếu nguồn dữ liệu nằm dưới
thay đổi trong thời gian sống của enumerator, MoveNext sẽ
ném ngoại lệ InvalidOperationException.
Reset
Phương thức này dịch chuyển enumerator về vị trí đứng
trước phần tử đầu tiên trong tập hợp dữ liệu. Nếu nguồn dữ
liệu nằm dưới thay đổi trong thời gian sống của enumerator,
Reset sẽ ném ngoại lệ InvalidOperationException.
[
Các lớp TeamMember, Team, và TeamMemberEnumerator minh họa việc hiện thực giao
diện IEnumerable và IEnumerator. Lớp TeamMember mô tả một thành viên của một đội:
// Lớp TeamMember mô tả một thành viên trong đội.
public class TeamMember {

public string Name;
public string Title;

// Phương thức khởi dựng đơn giản.
public TeamMember(string name, string title) {

Name = name;
Title = title;
}

// Trả về chuỗi mô tả TeamMember.


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status