624
Chương 16: Các giao diện và mẫu thông dụng
public TeamMember(string name, string title) {
Name = name;
Title = title;
}
// Trả về chuỗi mô tả TeamMember.
public override string ToString() {
return string.Format("{0} ({1})", Name, Title);
}
}
Lớp
Team
(mô tả một đội) là một tập hợp các đối tượng
TeamMember
. Lớp này hiện thực giao
diện
IEnumerable
và khai báo một lớp có tên là
TeamMemberEnumerator
để cung cấp chức năng
liệt kê. Thông thường, các lớp tập hợp sẽ trực tiếp hiện thực cả giao diện
IEnumerable
và
IEnumerator
. Tuy nhiên, sử dụng một lớp enumerator riêng biệt là cách đơn giản nhất để cho
phép nhiều enumerator—và nhiều tiểu trình—liệt kê đồng thời các phần tử của
Team
.
Team
hiện thực mẫu Observer bằng cách sử dụng các thành viên sự kiện và ủy nhiệm để báo
cho tất cả các đối tượng
TeamMemberEnumerator
biết
Team
nằm dưới có thay đổi hay không
(xem mục 16.10 để có thêm thông tin về mẫu Observer). Lớp
TeamMemberEnumerator
là một
lớp
private
lồng bên trong nên bạn không thể tạo các thể hiện của nó, trừ khi thông qua
phương thức
Team.GetEnumerator
. Dưới đây là phần mã cho lớp
Team
và
TeamMemberEnumerator
:
// Lớp Team mô tả tập hợp các đối tượng TeamMember. Hiện thực giao diện
// IEnumerable để hỗ trợ việc liệt kê các đối tượng TeamMember.
public class Team : IEnumerable {
// TeamMemberEnumerator là một lớp private lồng bên trong, cung cấp
// chức năng liệt kê các đối tượng TeamMember trong tập hợp
// Team. Vì là lớp lồng bên trong nên TeamMemberEnumerator
// có thể truy xuất các thành viên private của lớp Team.
private class TeamMemberEnumerator : IEnumerator {
private Team sourceTeam;
// Giá trị luận lý cho biết Team nằm dưới có thay đổi hay không.
private bool teamInvalid = false;