Thông tin tài liệu:
IDerived, giao diện mới này làm ẩn thuộc tính P với một phương thức mới P():interface IDerived : IBase { new int P(); }
Nội dung trích xuất từ tài liệu:
Mô hình kế thừa trong C# và một số mẹo lập trình Ngôn Ngữ Lập Trình C# { int P { get; set;} }và sau đó chúng ta dẫn xuất từ giao diện này ra một giao diện khác, IDerived, giao diện mớinày làm ẩn thuộc tính P với một phương thức mới P(): interface IDerived : IBase { new int P(); }Việc cài đặt này là một ý tưởng tốt, bây giờ chúng ta có thể ẩn thuộc tính P trong lớp cơ sở.Một thực thi của giao diện dẫn xuất này đòi hỏi tối thiểu một thành viên giao diện tườngminh. Chúng ta có thể sử dụng thực thi tường minh cho thuộc tính của lớp cơ sở hoặc củaphương thức dẫn xuất, hoặc chúng ta có thể sử dụng thực thi tường minh cho cả hai. Do đó,ba phiên bản được viết sau đều hợp lệ: class myClass : IDerived { // thực thi tường minh cho thuộc tính cơ sở int IBase.p { get{...}} // thực thi ngầm định phương thức dẫn xuất public int P() {...} } class myClass : IDerived { // thực thi ngầm định cho thuộc tính cơ sở public int P { get{...}} // thực thi tường minh phương thức dẫn xuất int IDerived.P() {...} } class myClass : IDerived { // thực thi tường minh cho thuộc tính cơ sở int IBase.P { get{...}} // thực thi tường minh phương thức dẫn xuất int IDerived.P(){...} }Truy cập lớp không cho dẫn xuất và kiểu giá trị 201 Thực Thi Giao Diện Ngôn Ngữ Lập Trình C#Nói chung, việc truy cập những phương thức của một giao diện thông qua việc gán cho giaodiện thì thường được thích hơn. Ngoại trừ đối với kiểu giá trị (như cấu trúc) hoặc với các lớpkhông cho dẫn xuất (sealed class). Trong trường hợp này, cách ưu chuộng hơn là gọi phươngthức giao diện thông qua đối tượng.Khi chúng ta thực thi một giao diện trong một cấu trúc, là chúng ta đang thực thi nó trong mộtkiểu dữ liệu giá trị. Khi chúng ta gán cho môt tham chiếu giao diện, có một boxing ngầm địnhcủa đối tượng. Chẳng may khi chúng ta sử dụng giao diện để bổ sung đối tượng, nó là một đốitượng đã boxing, không phải là đối tượng nguyên thủy cần được bổ sung. Xa hơn nữa, nếuchúng ta thay đổi kiểu dữ liệu giá trị, thì kiểu dữ liệu được boxing vẫn không thay đổi. Ví dụ8.6 tạo ra một cấu trúc và thực thi một giao diện IStorable và minh họa việc boxing ngầmđịnh khi gán một cấu trúc cho một tham chiếu giao diện. Ví dụ 8.6: Tham chiếu đến kiểu dữ liệu giá trị.-----------------------------------------------------------------------------using System;// khai báo một giao diện đơninterface IStorable{ void Read(); int Status { get; set;}}// thực thi thông qua cấu trúcpublic struct myStruct : IStorable{ public void Read() { Console.WriteLine(“Implementing IStorable.Read”); } public int Status { get { return status; } set { status = value; } } 202 Thực Thi Giao Diện Ngôn Ngữ Lập Trình C# // biến thành viên lưu giá trị thuộc tính Status private int status;}public class Tester{ static void Main() { // tạo một đối tượng myStruct myStruct theStruct = new myStruct(); theStruct.Status = -1; // khởi tạo Console.WriteLine(“theStruct.Status: {0}”, theStruct.Status); // thay đổi giá trị theStruct.Status = 2; Console.WriteLine(“Changed object”); Console.WriteLine(“theStruct.Status: {0}”, theStruct.Status); // gán cho giao diện // boxing ngầm định IStorable isTemp = (IStorable) theStruct; // thiết lập giá trị thông qua tham chiếu giao diện isTemp.Status = 4; Console.WriteLine(“Changed interface”); Console.WriteLine(“theStruct.Status: {0}, isTemp: {1}”, theStruct.Status, isTemp.Status); // thay đổi giá trị một lần nữa theStruct.Status = 6; Console.WriteLine(“Changed object.”); Console.WriteLine(“theStruct.Status: {0}, isTemp: {1}”, theStruct.Status, isTemp.Status); }}----------------------------------------------------------------------------- Kết quả:theStruct.Status: -1Changed object.theStruct.Status: 2Changed interfacetheStruct.Status: 2, isTemp: 4Changed object 203 Thực Thi Giao Diện ...