THỰC THI GIAO DIỆN phần 3
Số trang: 12
Loại file: pdf
Dung lượng: 185.67 KB
Lượt xem: 10
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:
Biểu thức điều kiện sẽ trả về giá trị true và phép gán sẽ được thực hiện khi đối tượng có thực thi giao diện bên phải của toán tử is. Tuy nhiên, việc sử dụng toán tử is đưa ra một việc không có hiệu quả. Để hiểu được điều này, chúng ta xem đoạn chương trình được biên dịch ra mã IL.
Nội dung trích xuất từ tài liệu:
THỰC THI GIAO DIỆN phần 3Biểu thức điều kiện sẽ trả về giá trị true và phép gán sẽ được thực hiện khi đối tượng cóthực thi giao diện bên phải của toán tử is.Tuy nhiên, việc sử dụng toán tử is đưa ra một việc không có hiệu quả. Để hiểu đượcđiều này, chúng ta xem đoạn chương trình được biên dịch ra mã IL. Ở đây sẽ có mộtngoại lệ nhỏ, các dòng bên dưới là 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 ra là khi phép kiểm tra ICompressible ở dòng 23. Từ khóa isinst làmã MSIL tương ứng với toán tử is. Nếu việc kiểm tra đối tượng (doc) đúng kiểu củakiểu bên phải. Thì chương trình sẽ chuyển đến dòng lệnh 2b để thực hiện tiếp vàcastclass được gọi. Điều không may là castcall cũng kiểm tra kiểu của đối tượng. Dođó việc kiểm tra sẽ được thực hiện hai lần. Giải pháp hiệu quả hơn là việc sử dụng toántử as.Toán tử as Toán tử as kết hợp toán tử is và phép gán bằng cách đầu tiên kiểm tra hợp lệphép gán (kiểm tra toán tử is trả về true) rồi sau đó phép gán được thực hiện. Nếuphép gán không hợp lệ (khi phép gán trả ề giá trị false), thì toán tử as trả về giá trị null. Ghi chú: Từ khóa null thể hiện một tham chiếu không tham chiếu đến đâu cả (null reference). Đối tượng có giá trị null tức là không tham chiếu đến bất kỳ đối tượng nào.Sử dụng toán tử as để loại bỏ việc thực hiện các xử lý ngoại lệ. Đồng thời cũng né tránhviệc thực hiện kiểm tra dư thừa hai lần. Do vậy, việc sử dụng tối ưu của phép gán chogiao diện là sử dụng as.Cú pháp sử dụng toán tử as như sau: as Đoạn chương trình sau thay thế việc sử dụng toán tử is bằng toán tử as và sau đó thựchiện việc kiểm tra xem giao diện được gán có null hay không: static void Main() { Document doc = new Document(“TestDocument”); 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”);} }Ta có thể so sánh đoạn mã IL sau với đoạn mã IL sử dụng toán tử is trước sẽ thấy đoạnmã sau có nhiều hiệu quả 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 của chúng ta là kiểm tra một đối tượng có hỗ trợ một giaodiện và sau đó là thực hiện việc gán cho một giao diện, thì cách tốt nhất là sử dụng toán tử as là hiệu quả nhất. Tuy nhiên, nếu chúng ta chỉ muốn kiểm tra kiểu dữ liệu vàkhông thực hiện phép gán ngay lúc đó. Có lẽ chúng ta chỉ muốn thực hiện việc kiểm tra nhưng không thực hiện việc gán, đơn giản là chúng ta muốn thêm nó vào danh sách nếu chúng thực sự là một giao diện. Trong trường hợp này, sử dụng toán tử is là cách lựa chọn tốt nhất.Giao diện đối lập với lớp trừu tượng Giao diện rất giống như các lớp trừu tượng. Thật vậy, chúng ta có thể thay thếkhai báo của IStorable trở thành một lớp trừu tượng: abstract class Storable { abstract public void Read(); abstract public void Write(); }Bây giờ lớp Document có thể thừa kế từ lớp trừu tượng IStorable, và cũng không có gìkhác nhiều so với việc sử dụng giao diện.Tuy nhiên, giả sử chúng ta mua một lớp List từ một hãng thứ ba và chúng ta muốn kếthợpvới lớp có sẵn như Storable. Trong ngôn ngữ C++ chúng ta có thể tạo ra một lớpStorableListkế thừa từ List và cả Storable. Nhưng trong ngôn ngữ C# chúng ta không thểlàm được, chúng ta không thể kế thừa từ lớp trừu tượng Storable và từ lớp List bởivì trong C# không cho phép thực hiện đa kế thừa từ những lớp.Tuy nhiên, ngôn ngữ C# cho phép chúng ta thực thi bất cứ những giao diện nào và dẫnxuấttừ một lớp cơ sở. Do đó, bằng cách làm cho Storable là một giao diện, chúng ta cóthể kế thừa từ lớp List và cũng từ IStorable. Ta có thể tạo lớp StorableList như sau: public class StorableList : List, IStorable{ // phương thức List... ..... public void Read() {...} public void Write( object o) {...} //.... }Thực thi phủ quyết giao diện Khi thực thi một lớp chúng ta có thể tự do đánh dấu bất kỳ hay tất cả cácphương thức thực thi giao diện như là một phương thức ảo. Ví dụ, lớpDocument thực thi giao d ...
Nội dung trích xuất từ tài liệu:
THỰC THI GIAO DIỆN phần 3Biểu thức điều kiện sẽ trả về giá trị true và phép gán sẽ được thực hiện khi đối tượng cóthực thi giao diện bên phải của toán tử is.Tuy nhiên, việc sử dụng toán tử is đưa ra một việc không có hiệu quả. Để hiểu đượcđiều này, chúng ta xem đoạn chương trình được biên dịch ra mã IL. Ở đây sẽ có mộtngoại lệ nhỏ, các dòng bên dưới là 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 ra là khi phép kiểm tra ICompressible ở dòng 23. Từ khóa isinst làmã MSIL tương ứng với toán tử is. Nếu việc kiểm tra đối tượng (doc) đúng kiểu củakiểu bên phải. Thì chương trình sẽ chuyển đến dòng lệnh 2b để thực hiện tiếp vàcastclass được gọi. Điều không may là castcall cũng kiểm tra kiểu của đối tượng. Dođó việc kiểm tra sẽ được thực hiện hai lần. Giải pháp hiệu quả hơn là việc sử dụng toántử as.Toán tử as Toán tử as kết hợp toán tử is và phép gán bằng cách đầu tiên kiểm tra hợp lệphép gán (kiểm tra toán tử is trả về true) rồi sau đó phép gán được thực hiện. Nếuphép gán không hợp lệ (khi phép gán trả ề giá trị false), thì toán tử as trả về giá trị null. Ghi chú: Từ khóa null thể hiện một tham chiếu không tham chiếu đến đâu cả (null reference). Đối tượng có giá trị null tức là không tham chiếu đến bất kỳ đối tượng nào.Sử dụng toán tử as để loại bỏ việc thực hiện các xử lý ngoại lệ. Đồng thời cũng né tránhviệc thực hiện kiểm tra dư thừa hai lần. Do vậy, việc sử dụng tối ưu của phép gán chogiao diện là sử dụng as.Cú pháp sử dụng toán tử as như sau: as Đoạn chương trình sau thay thế việc sử dụng toán tử is bằng toán tử as và sau đó thựchiện việc kiểm tra xem giao diện được gán có null hay không: static void Main() { Document doc = new Document(“TestDocument”); 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”);} }Ta có thể so sánh đoạn mã IL sau với đoạn mã IL sử dụng toán tử is trước sẽ thấy đoạnmã sau có nhiều hiệu quả 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 của chúng ta là kiểm tra một đối tượng có hỗ trợ một giaodiện và sau đó là thực hiện việc gán cho một giao diện, thì cách tốt nhất là sử dụng toán tử as là hiệu quả nhất. Tuy nhiên, nếu chúng ta chỉ muốn kiểm tra kiểu dữ liệu vàkhông thực hiện phép gán ngay lúc đó. Có lẽ chúng ta chỉ muốn thực hiện việc kiểm tra nhưng không thực hiện việc gán, đơn giản là chúng ta muốn thêm nó vào danh sách nếu chúng thực sự là một giao diện. Trong trường hợp này, sử dụng toán tử is là cách lựa chọn tốt nhất.Giao diện đối lập với lớp trừu tượng Giao diện rất giống như các lớp trừu tượng. Thật vậy, chúng ta có thể thay thếkhai báo của IStorable trở thành một lớp trừu tượng: abstract class Storable { abstract public void Read(); abstract public void Write(); }Bây giờ lớp Document có thể thừa kế từ lớp trừu tượng IStorable, và cũng không có gìkhác nhiều so với việc sử dụng giao diện.Tuy nhiên, giả sử chúng ta mua một lớp List từ một hãng thứ ba và chúng ta muốn kếthợpvới lớp có sẵn như Storable. Trong ngôn ngữ C++ chúng ta có thể tạo ra một lớpStorableListkế thừa từ List và cả Storable. Nhưng trong ngôn ngữ C# chúng ta không thểlàm được, chúng ta không thể kế thừa từ lớp trừu tượng Storable và từ lớp List bởivì trong C# không cho phép thực hiện đa kế thừa từ những lớp.Tuy nhiên, ngôn ngữ C# cho phép chúng ta thực thi bất cứ những giao diện nào và dẫnxuấttừ một lớp cơ sở. Do đó, bằng cách làm cho Storable là một giao diện, chúng ta cóthể kế thừa từ lớp List và cũng từ IStorable. Ta có thể tạo lớp StorableList như sau: public class StorableList : List, IStorable{ // phương thức List... ..... public void Read() {...} public void Write( object o) {...} //.... }Thực thi phủ quyết giao diện Khi thực thi một lớp chúng ta có thể tự do đánh dấu bất kỳ hay tất cả cácphương thức thực thi giao diện như là một phương thức ảo. Ví dụ, lớpDocument thực thi giao d ...
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# THỰC THI GIAO DIỆN phần 3Gợi ý tài liệu liên quan:
-
52 trang 425 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 308 0 0 -
74 trang 291 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 -
96 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 276 0 0 -
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 269 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 269 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 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 259 0 0