Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 24 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
24
Dung lượng
73,51 KB
Nội dung
Giao diện Interfaces Kiểu interface Kiểu interface giống như 1 lớp trừu tượng nhưng chỉ bao gồm tên các thành viên trừu tượng (thuộc tính, phương thức) Mọi thành viên tronginterface đều là public (không viết khi định nghĩa thành viên) Tên interface nên được bắt đầu bằng kí tự I hoa public interface IPoint { double X { get; set; } double Y { get; set; } void Draw(); } Giao diện và lớp Interface Không thể tạo thể hiện bằng từ khóa new Không thể định nghĩa trường Các thành viên đều là public (nhưng không viết public) Không có hàm khởi tạo Không được hiện thực các phương thức Khi hiện thực interface, bắt buộc phải hiện thực tất cả phương thức, không sử dụng từ khóa override Class Có thể tạo thể hiện bằng new (trừ lớp trừu tượng) Có trường dữ liệu Các thành viên có thể là public, private, protected Có thể tạo hàm khởi tạo Phải hiện thực các phương thức (trừ lớp trừu tượng) Khi kế thừa, không cần ghi đè các phương thức, nếu ghi đè phải có từ khóa override Hiện thực một giao diện Trong C#, chúng ta có thể dùng class hoặc struct để hiện thực 1 giao diện, cú pháp giống như kế thừa 1 class public class Point : IPoint C# cho phép 1 class hoặc struct hiện thực được nhiều giao diện public class Point : IPoint, IComparable Khi hiện thực 1 giao diện, ta phải hiện thực toàn bộ các phương thức của giao diện đó, kể cả các hàm get, set của thuộc tính Hiện thực một giao diện public class Point : IPoint { public double X { get; set; } public double Y { get; set; } public void Draw() { Console.WriteLine(“{0} {1}”, X, Y); } public Point() { } public Point(double x, double y) { X = x; Y = y; } } Gọi các thành viên của giao diện ở cấp độ đối tượng Ta có thể tạo 1 thể hiện của giao diện bằng cách ép kiểu tường minh 1 đối tượng. Nếu đối tượng này thuộc kiểu class hiện thực giao diện thì chuyển đổi thành công (tạm gọi là tương thích với kiểu giao diện đó), ngược lại thì sẽ ném ra 1 ngoại lệ kiểu InvalidCastException Ta có thể gọi các thành viên của giao diện thông qua thể hiện này, các thành viên của thể hiện này chính là các thành viên của đối tượng được ép kiểu Point a = new Point(1, 2); IPoint b = (IPoint)a; b.Draw(); // Output: // 1 2 Ép kiểu thành giao diện Tương tự ép kiểu với class, ta có thể dùng các toán tử ép kiểu, toán tử as để ép kiểu và toán tử is để kiểm tra tính tương thích Point p1 = new Point(2,3); Humans man = new Humans(); IPoint a = (IPoint)p1; IPoint b = man as IPoint; // b = null bool kt = p1 is IPoint; // kt = true Kiểu interface trong tham số của phương thức Trong 1 phương thức, ta có thể khai báo tham số có kiểu interface Khi truyền giá trị cho hàm, ta có thể truyền bất kì đối tượng nào có kiểu tương thích với interface đó, việc chuyển kiểu sẽ được làm tụ động public static void Draw3D(IPoint p) { Console.WriteLine(“Draw 3D: {0} {1}”, p.X, p.Y); } Kiểu interface trong tham số của phương thức public static void Main(string[] args) { Point p1 = new Point(1, 2); IPoint ip = (IPoint) new Point(3, 4); Draw3D(p1); Draw3D(ip); } // Output: // Draw 3D: 1 2 // Draw 3D: 3 4 Kiểu interface là kiểu trả về của phương thức Tương tự với tham số kiểu interface, ta có thể return bất kì đối tượng nào tương thích với kiểu interface đó public IPoint Add(IPoint a, IPoint b) { return new Point(a.X + b.X, a.Y + b.Y); // hoặc có thể return thể hiện của IPoint // return (IPoint) new Point(a.X + b.X, a.Y + b.Y); } [...]... theo cách không tường minh Việc hiện thực không tường minh này có thể dẫn tới trường hợp nhiều interface có chung 1 phương thức Cách giải quyết là hiện thực giao diện tường minh public interface IDrawToForm { void Draw(); Hiện thực giao diện tường } minh { public interface IDrawToMemory void Draw(); } public interface IDrawToPrinter { void Draw(); } public class Rectangle : IDrawToForm, IDrawToMemory,... thức, mở rộng giao diện giống như kế thừa class public interface IPoint3D : IPoint Mở rộng giao diện { double Z { get; set; } } Nếu mở rộng nhiều giao diện, có thể xảy ra trùng tên thành viên, khi hiện thực giao diện mở rộng, ta có thể hiện thực từng thành viên trùng tên bằng cách hiện thực tường minh public interface IDrawable { void Draw(); } public interface IPoint3D : IPoint, IDrawable { double Z... 1 đối tượng khác bằng phương thức Clone public interface ICloneable { object Clone(); ICloneable } Khi hiện thực giao diện này, trong phương thức Clone, ta nên sử dụng phương thức MemberwiseClone của lớp Object Sử dụng: Car a = new Car(); Car b = (Car)a.Clone(); IComparable: dùng để so sánh 2 đối tượng cùng kiểu với phương thức CompareTo public interface IComparable { int CompareTo(object obj);... IDrawable.Draw() { } } Một vài giao diện quen thuộc IEnumerable: dùng để liệt kê các phần tử của 1 đối tượng thông qua lệnh foreach public interface IEnumerable { IEnumerator GetEnumerator(); } IEnumerable & IEnumerator Hàm GetEnumerator trả về 1 kiểu IEnumerator public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); } Giả sử có class Cars hiện thực giao diện IEnumerable,... (list.MoveNext()) { Car a = (Car)list.Current; // Lệnh } Để sử dụng phương thức trả về nhiều lần, phương thức đo phải trả về một IEnumerable Với từ khóa yield return, phương thức sẽ trả về 1 giá trị trong danh sách các phần tử của IEnumerable rồi tiếp tục chạy phương thức cho đến khi hết các lệnh hoặc đến khi gặp yield break public IEnumerator F() Phương thức trả về nhiều { lần với từ khóa yield yield... IDrawToPrinter.Draw() { } } Khi hiện thực theo cách này, các thành viên đều là private, ta không thể thêm các bổ từ truy xuất, để gọi các thành viên này, ta cần tạo 1 thể hiện của giao diện rồi gọi bằng thế hiện đó Trong cùng 1 class hiện thực nhiều giao diện, ta có thể hiện thực theo kiểu tường minh và không tường minh Các giao diện không được hiện thực tường minh thì sẽ nhận giá trị hiện thực không tường minh public... phần tử kiểu class đó sẽ dùng được phương thức Sort (sắp xếp) Sử dụng Car[] arr = { }; Array.Sort(arr); IComparer: dùng để so sánh 2 đối tượng, được sử dụng để sắp xếp mảng theo thứ tự tùy ý public interface IComparer { int Compare(object obj1, object obj2) IComparer } Sử dụng IComparer a = ; Car[] arr = { }; Array.Sort(arr, a); . Giao diện Interfaces Kiểu interface Kiểu interface giống như 1 lớp trừu tượng nhưng chỉ bao gồm tên các thành viên trừu tượng (thuộc tính, phương thức) Mọi thành viên trong interface đều. null bool kt = p1 is IPoint; // kt = true Kiểu interface trong tham số của phương thức Trong 1 phương thức, ta có thể khai báo tham số có kiểu interface Khi truyền giá trị cho hàm, ta có. nhiều interface có chung 1 phương thức. Cách giải quyết là hiện thực giao diện tường minh public interface IDrawToForm { void Draw(); } public interface IDrawToMemory { void Draw(); } public interface