Danh mục

Các giao diện và mẫu phần 3

Số trang: 9      Loại file: pdf      Dung lượng: 178.96 KB      Lượt xem: 1      Lượt tải: 0    
Jamona

Hỗ trợ phí lưu trữ khi tải xuống: 2,000 VND Tải xuống file đầy đủ (9 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

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
Nội dung trích xuất từ tài liệu:
Các giao diện và mẫu phần 3// 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; // Giá trị nguyên cho biết TeamMember hiện tại (chỉ số // trong ArrayList). Giá trị ban đầu là -1. private int currentMember = -1; // Phương thức khởi dựng (nhận một tham chiếu đến Team). internal TeamMemberEnumerator(Team team) { this.sourceTeam = team; sourceTeam.TeamChange += new TeamChangedEventHandler(this.TeamChange); } // Hiện thực thuộc tính IEnumerator.Current. public object Current { get { // Nếu TeamMemberEnumerator đứng trước phần tử đầu tiên // hoặc sau phần tử cuối cùng thì ném ngoại lệ. if (currentMember == -1 || currentMember > (sourceTeam.teamMembers.Count-1)) { throw new InvalidOperationException(); } // Nếu không, trả về TeamMember hiện tại. return sourceTeam.teamMembers[currentMember]; }}// Hiện thực phương thức IEnumerator.MoveNext.public bool MoveNext() { // Nếu Team nằm dưới bất hợp lệ, ném ngoại lệ. if (teamInvalid) { throw new InvalidOperationException(Team modified); } // Nếu không, tiến đến TeamMember kế tiếp. currentMember++; // Trả về false nếu ta dịch qua khỏi TeamMember cuối cùng. if (currentMember > (sourceTeam.teamMembers.Count-1)) { return false; } else { return true; }}// Hiện thực phương thức IEnumerator.Reset. Phương thức này// reset vị trí của TeamMemberEnumerator về đầu tập hợp Team.public void Reset() { // Nếu Team nằm dưới bất hợp lệ, ném ngoại lệ. if (teamInvalid) { throw new InvalidOperationException(Team modified); } // Dịch con trỏ currentMember về trước phần tử đầu tiên. currentMember = -1;} // Phương thức thụ lý sự kiện tập hợp Team nằm dưới thay đổi. internal void TeamChange(Team t, EventArgs e) { // Báo hiệu Team nằm dưới hiện đang bất hợp lệ. teamInvalid = true; }}// Ủy nhiệm dùng để chỉ định chữ ký mà tất cả// các phương thức thụ lý sự kiện phải hiện thực.public delegate void TeamChangedEventHandler(Team t, EventArgs e);// ArrayList dùng để chứa các đối tượng TeamMember.private ArrayList teamMembers;// Sự kiện dùng để báo cho TeamMemberEnumerator// biết Team đã thay đổi.public event TeamChangedEventHandler TeamChange;// Phương thức khởi dựng Team.public Team() { teamMembers = new ArrayList();}// Hiện thực phương thức IEnumerable.GetEnumerator.public IEnumerator GetEnumerator() { return new TeamMemberEnumerator(this);}// Thêm một đối tượng TeamMember vào Team.public void AddMember(TeamMember member) { teamMembers.Add(member); if (TeamChange != null) { TeamChange(this, null); } }}Nếu lớp tập hợp của bạn chứa nhiều kiểu dữ liệu khác nhau và bạn muốn liệt kê chúngmột cách riêng rẽ, việc hiện thực giao diện IEnumerable trên lớp tập hợp này thì vẫn cònthiếu. Trong trường hợp này, bạn cần hiện thực một số thuộc tính trả về các thể hiện khácnhau của IEnumerator. Ví dụ, nếu lớp Team mô tả cả các thành viên và các máy tínhtrong đội, bạn có thể hiện thực các thuộc tính này như sau:// Thuộc tính dùng để liệt kê các thành viên trong đội.public IEnumerator Members { get { return new TeamMemberEnumerator(this); }}// Thuộc tính dùng để liệt kê các computer trong đội.public IEnumerator Computers { get { return new TeamComputerEnumerator(this); }}Khi đó, bạn có thể sử dụng các enumerator này như sau:Team team = new Team();§foreach(TeamMember in team.Members) { // Làm gì đó...}foreach(TeamComputer in team.Computers) { // Làm gì đó...}• Lệnh foreach cũng hỗ trợ các kiểu có hiện thực một mẫu tương đương với mẫu được định nghĩa bởi giao diện IEnumerable và IEnumerator, mặc dù kiểu đó không hiện thực các giao diện này. Tuy nhiên, mã lệnh của bạn sẽ rõ ràng hơn và dễ hiểu hơn nếu bạn hiện thực giao diện IEnumerable. Bạn hãy xem C# Language Specification để biết chi tiết về các yêu cầu của lệnh foreach [http://msdn.microsoft. com/net/ecma]. Hiện thực lớp khả-hủy (disposable class) Bạn cần tạo một lớp có tham chiếu đến các tài nguyên không-được-quản-lý và cung cấp một cơ chế để người dùng giải phóng các tài nguyên đó một cách tất định.▪ Hiện thực giao diện System.IDisposable, và giải phóng các tài nguyên không- được-quản-lý khi mã client gọi phương thức IDisposable.Dispose.Một đối tượng không được tham chiếu đến vẫn tồn tại trên vùng nhớ động (heap) và tiêuthụ các tài nguyên cho đến khi bộ thu gom rác (Garbage Collector) giải phóng đối tượngvà các tài nguyên. Bộ thu gom rác sẽ tự động giải phóng các tài nguyên được-quản-lý(như bộ nhớ), nhưng nó sẽ không giải phóng các tài nguyên không-được-quản-lý (nhưfile handle và kết nối cơ sở dữ liệu) được tham chiếu bởi các đối tượng được-quản-lý.Nếu một đối tượng chứa các thành viên dữ liệu tham chiếu đến các tài nguyên không-được-quản-lý, đối tượng này phải giải phóng các tài nguyên đó.Một giải pháp là khai báo một destructor—hay finalizer—cho lớp. Trước khi giải phóngphần bộ nhớ do một thể hiện của lớp sử dụng, bộ thu gom rác sẽ gọi finalizer của đốitượng này ...

Tài liệu được xem nhiều: