Các giao diện và mẫu phần 2
Số trang: 8
Loại file: pdf
Dung lượng: 162.64 KB
Lượt xem: 13
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bạ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.
Nội dung trích xuất từ tài liệu:
Các giao diện và mẫu phần 2 1.1 Hiện thực kiểu khả-so-sánh (comparable type) Bạ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êntheo thứ tự alphabet), bạn nên hiện thực giao diện IComparable. Giao diện này định nghĩaphươ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ếukhông CompareTo sẽ ném ngoại lệ System.ArgumentException. Giá trị do CompareTotrả 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ệnIComparable. 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ánhchuỗ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épso sánh ngày (System.DateTime).Để hỗ trợ nhiều dạng sắp xếp cho một kiểu cụ thể, bạn phải hiện thực riêng rẽ từng kiểutrợ giúp và các kiểu này hiện thực giao diện IComparer. Giao diện này định nghĩaphương thức Compare như sau:int Compare(object x, object y);Kiểu trợ giúp phải đóng gói logic cần thiết để so sánh hai đối tượng và trả về một giá trịdựa trên logic như sau: • Nếu x nhỏ hơn y, trả về một số âm (chẳng hạn, -1). • Nếu x có cùng giá trị như y, trả về zero. • Nếu x lớn hơn y, trả về một số dương (chẳng hạn, 1).Lớp Newspaper dưới đây hiện thực cả giao diện IComparable và IComparer. Phươngthức Newspaper.CompareTo thực hiện phép so sánh không phân biệt chữ hoa-thường haiđối tượng Newspaper dựa trên trường name của chúng. Một lớp private lồng bên trong cótên là AscendingCirculationComparer hiện thực IComparer và so sánh hai đối tượngNewspaper dựa trên trường circulation của chúng. Đối tượngAscendingCirculationComparer được thu lấy bằng thuộc tính tĩnhNewspaper.CirculationSorter.using System;using System.Collections;public class Newspaper : IComparable { private string name; private int circulation; private class AscendingCirculationComparer : IComparer { int IComparer.Compare(object x, object y) { // 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; }}public Newspaper(string name, int circulation) { this.name = name; this.circulation = circulation;}// Khai báo một thuộc tính chỉ-đọc, trả về một thể hiện của// AscendingCirculationComparer.public static IComparer CirculationSorter{ get { return new AscendingCirculationComparer(); }}public override string ToString() { return string.Format({0}: Circulation = {1}, name, circulation);}// Phương thức CompareTo so sánh hai đối tượng Newspaper dựa trên// phép so sánh trường name (không phân biệt chữ hoa-thường).public int CompareTo(object obj) { // Một đối tượng luôn được coi như lớn hơn null. if (obj == null) return 1; // Trường hợp đối tượng kia là một tham chiếu đến đối tượng này. if (obj == this) return 0; // Ép đối tượng kia về Newspaper. 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). / ...
Nội dung trích xuất từ tài liệu:
Các giao diện và mẫu phần 2 1.1 Hiện thực kiểu khả-so-sánh (comparable type) Bạ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êntheo thứ tự alphabet), bạn nên hiện thực giao diện IComparable. Giao diện này định nghĩaphươ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ếukhông CompareTo sẽ ném ngoại lệ System.ArgumentException. Giá trị do CompareTotrả 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ệnIComparable. 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ánhchuỗ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épso sánh ngày (System.DateTime).Để hỗ trợ nhiều dạng sắp xếp cho một kiểu cụ thể, bạn phải hiện thực riêng rẽ từng kiểutrợ giúp và các kiểu này hiện thực giao diện IComparer. Giao diện này định nghĩaphương thức Compare như sau:int Compare(object x, object y);Kiểu trợ giúp phải đóng gói logic cần thiết để so sánh hai đối tượng và trả về một giá trịdựa trên logic như sau: • Nếu x nhỏ hơn y, trả về một số âm (chẳng hạn, -1). • Nếu x có cùng giá trị như y, trả về zero. • Nếu x lớn hơn y, trả về một số dương (chẳng hạn, 1).Lớp Newspaper dưới đây hiện thực cả giao diện IComparable và IComparer. Phươngthức Newspaper.CompareTo thực hiện phép so sánh không phân biệt chữ hoa-thường haiđối tượng Newspaper dựa trên trường name của chúng. Một lớp private lồng bên trong cótên là AscendingCirculationComparer hiện thực IComparer và so sánh hai đối tượngNewspaper dựa trên trường circulation của chúng. Đối tượngAscendingCirculationComparer được thu lấy bằng thuộc tính tĩnhNewspaper.CirculationSorter.using System;using System.Collections;public class Newspaper : IComparable { private string name; private int circulation; private class AscendingCirculationComparer : IComparer { int IComparer.Compare(object x, object y) { // 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; }}public Newspaper(string name, int circulation) { this.name = name; this.circulation = circulation;}// Khai báo một thuộc tính chỉ-đọc, trả về một thể hiện của// AscendingCirculationComparer.public static IComparer CirculationSorter{ get { return new AscendingCirculationComparer(); }}public override string ToString() { return string.Format({0}: Circulation = {1}, name, circulation);}// Phương thức CompareTo so sánh hai đối tượng Newspaper dựa trên// phép so sánh trường name (không phân biệt chữ hoa-thường).public int CompareTo(object obj) { // Một đối tượng luôn được coi như lớn hơn null. if (obj == null) return 1; // Trường hợp đối tượng kia là một tham chiếu đến đối tượng này. if (obj == this) return 0; // Ép đối tượng kia về Newspaper. 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). / ...
Tìm kiếm theo từ khóa liên quan:
công nghệ thông tin kĩ thuật lập trình ngôn ngữ lập trình ngôn ngữ C# C# Các giao diện và mẫu phần 2Gợi ý tài liệu liên quan:
-
52 trang 429 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 311 0 0 -
74 trang 294 0 0
-
96 trang 290 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 288 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 278 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 272 0 0 -
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 271 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 262 0 0