1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình hướng dẫn truy cập phương thức gán đối tượng cho một giao diện đối lập trừu tượng p4

5 9 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

Nếu đưa ra một kiểu Document, và ta cũng không biết là lớp này có hỗ trợ giao diện IStorable hay ICompressible hoặc cả hai. Ta có thể có đoạn chương trình sau: Document doc = new Document(“Test Document”); IStorable isDoc = (IStorable) doc; isDoc.Read(); ICompressible icDoc = (ICompressible) doc; icDoc.Compress();

Ngơn Ngữ Lập Trình C# void Compress(); void Decompress(); } Nếu đưa kiểu Document, ta lớp có hỗ trợ giao diện IStorable hay ICompressible hai Ta có đoạn chương trình sau: Document doc = new Document(“Test Document”); IStorable isDoc = (IStorable) doc; isDoc.Read(); ICompressible icDoc = (ICompressible) doc; icDoc.Compress(); Nếu Document thực thi giao diện IStorable: public class Document : IStorable phép gán cho ICompressible biên dịch ICompressible giao diện hợp lệ Tuy nhiên, phép gán không hợp lệ nên chương trình chạy tạo ngoại lệ (exception): A exception of type System.InvalidCastException was thrown Phần ngoại lệ trình bày Chương 11 Tốn tử is Chúng ta muốn kiểm tra đối tượng xem có hỗ trợ giao diện, để sau thực phương thức tương ứng Trong ngôn ngữ C# có hai cách để thực điều Phương pháp sử dụng toán tử is Cú pháp toán tử is là: is Toán tử is trả giá trị true biểu thức thường kiểu tham chiếu gán an toàn đến kiểu liệu cần kiểm tra mà không phát sinh ngoại lệ Ví dụ 8.3 minh họa việc sử dụng tốn tử is để kiểm tra Document có thực thi giao diện IStorable hay ICompressible  Ví dụ 8.3: Sử dụng toán tử is using System; interface IStorable { void Read(); void Write(object obj); int Status { get; set; } } // giao diện 188 Thực Thi Giao Diện Ngôn Ngữ Lập Trình C# interface ICompressible { void Compress(); void Decompress(); } // Document thực thi IStorable public class Document : IStorable { public Document( string s) { Console.WriteLine(“Creating document with: {0}”, s); } // IStorable public void Read() { Console.WriteLine(“Implementing the Read Method for IStorable”); } // IStorable.WriteLine() public void Write( object o) { Console.WriteLine(“Implementing the Write Method for IStorable”); } // IStorable.Status public int Status { get { return status; } set { status = value; } } // bien vien luu gia tri cua thuoc tinh Status private int status = 0; } public class Tester 189 Thực Thi Giao Diện Ngơn Ngữ Lập Trình C# { static void Main() { Document doc = new Document(“Test Document”); // gán an toàn if ( doc is IStorable ) { IStorable isDoc = (IStorable) doc; isDoc.Read(); } // việc kiểm tra sai if ( doc is ICompressible ) { ICompressible icDoc = (ICompressible) doc; icDoc.Compress(); } } } Trong ví dụ 8.3, hàm Main() lúc thực việc gán với interface kiểm tra hợp lệ Việc kiểm tra thực câu lệnh if: if ( doc is IStorable ) Biểu thức điều kiện trả giá trị true phép gán thực đối tượng có thực thi giao diện bên phải toán tử is Tuy nhiên, việc sử dụng toán tử is đưa việc khơng có hiệu Để hiểu điều này, xem đoạn chương trình biên dịch mã IL Ở có ngoại lệ nhỏ, dòng bên sử dụng hệ thập lục phân: IL_0023: isinst ICompressible IL_0028: brfalse.s IL_0039 IL_002a: ldloc.0 IL_002b: castclass ICompressible IL_0030: stloc.2 IL_0031: ldloc.2 IL_0032: callvirt instance void ICompressible::Compress() IL_0037: br.s IL_0043 IL_0039: ldstr “Compressible not supported” Điều quan trọng xảy phép kiểm tra ICompressible dịng 23 Từ khóa isinst mã MSIL tương ứng với toán tử is Nếu việc kiểm tra đối tượng (doc) kiểu kiểu bên 190 Thực Thi Giao Diện Ngơn Ngữ Lập Trình C# phải Thì chương trình chuyển đến dịng lệnh 2b để thực tiếp castclass gọi Điều không may castcall kiểm tra kiểu đối tượng Do việc kiểm tra thực hai lần Giải pháp hiệu việc sử dụng toán tử as Toán tử as Toán tử as kết hợp toán tử is phép gán cách kiểm tra hợp lệ phép gán (kiểm tra toán tử is trả true) sau phép gán thực Nếu phép gán không hợp lệ (khi phép gán trả ề giá trị false), tốn tử as trả giá trị null Ghi chú: Từ khóa null thể tham chiếu không tham chiếu đến đâu (null reference) Đối tượng có giá trị null tức khơng tham chiếu đến đối tượng Sử dụng toán tử as để loại bỏ việc thực xử lý ngoại lệ Đồng thời né tránh việc thực kiểm tra dư thừa hai lần Do vậy, việc sử dụng tối ưu phép gán cho giao diện sử dụng as Cú pháp sử dụng toán tử as sau: as Đoạn chương trình sau thay việc sử dụng tốn tử is tốn tử as sau thực việc kiểm tra xem giao diện gán có null hay không: static void Main() { Document doc = new Document(“Test Document”); IStorable isDoc = doc as IStorable; if ( isDoc != null ) { isDoc.Read(); } else { Console.WriteLine(“IStorable not supported”); } ICompressible icDoc = doc as ICompressible; if ( icDoc != null) { icDoc.Compress(); } else { Console.WriteLine(“Compressible not supported”); } 191 Thực Thi Giao Diện Ngôn Ngữ Lập Trình C# } Ta so sánh đoạn mã IL sau với đoạn mã IL sử dụng tốn tử is trước thấy đoạn mã sau có nhiều hiệu hơn: IL_0023: isinst ICompressible IL_0028: stloc.2 IL_0029: ldloc.2 IL_002a: brfalse.s IL_0034 IL_002c: ldloc.2 IL_002d: callvirt instance void ICompressible::Compress() Ghi chú: Nếu mục đích kiểm tra đối tượng có hỗ trợ giao diện sau thực việc gán cho giao diện, cách tốt sử dụng toán tử as hiệu Tuy nhiên, muốn kiểm tra kiểu liệu khơng thực phép gán lúc Có lẽ muốn thực việc kiểm tra không thực việc gán, đơn giản muốn thêm vào danh sách chúng thực giao diện Trong trường hợp này, sử dụng toán tử is cách lựa chọn tốt Giao diện đối lập với lớp trừu tượng Giao diện giống lớp trừu tượng Thật vậy, thay khai báo IStorable trở thành lớp trừu tượng: abstract class Storable { abstract public void Read(); abstract public void Write(); } Bây lớp Document thừa kế từ lớp trừu tượng IStorable, khơng có khác nhiều so với việc sử dụng giao diện Tuy nhiên, giả sử mua lớp List từ hãng thứ ba muốn kết hợp với lớp có sẵn Storable Trong ngơn ngữ C++ tạo lớp StorableList kế thừa từ List Storable Nhưng ngôn ngữ C# làm được, kế thừa từ lớp trừu tượng Storable từ lớp List C# không cho phép thực đa kế thừa từ lớp Tuy nhiên, ngôn ngữ C# cho phép thực thi giao diện dẫn xuất từ lớp sở Do đó, cách làm cho Storable giao diện, kế thừa từ lớp List từ IStorable Ta tạo lớp StorableList sau: public class StorableList : List, IStorable { // phương thức List 192 Thực Thi Giao Diện ... việc gán, đơn giản muốn thêm vào danh sách chúng thực giao diện Trong trường hợp này, sử dụng toán tử is cách lựa chọn tốt Giao diện đối lập với lớp trừu tượng Giao diện giống lớp trừu tượng. .. từ lớp trừu tượng Storable từ lớp List C# khơng cho phép thực đa kế thừa từ lớp Tuy nhiên, ngôn ngữ C# cho phép thực thi giao diện dẫn xuất từ lớp sở Do đó, cách làm cho Storable giao diện, kế... Nếu mục đích kiểm tra đối tượng có hỗ trợ giao diện sau thực việc gán cho giao diện, cách tốt sử dụng toán tử as hiệu Tuy nhiên, muốn kiểm tra kiểu liệu không thực phép gán lúc Có lẽ muốn thực

Ngày đăng: 08/05/2021, 13:54

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN