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 p7

5 7 0

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

THÔNG TIN TÀI LIỆU

Nội dung

Mảng là một tập hợp có thứ tự của những đối tượng, tất cả các đối tượng này cùng một kiểu. Mảng trong ngôn ngữ C# có một vài sự khác biệt so với mảng trong ngôn ngữ C++ và một số ngôn ngữ khác, bởi vì chúng là những đối tượng. Điều này sẽ cung cấp cho mảng sử dụng các phương thức và những thuộc tính. Ngôn ngữ C# cung cấp cú pháp chuẩn cho

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 đố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ị lần theStruct.Status = 6; Console.WriteLine(“Changed object.”); Console.WriteLine(“theStruct.Status: {0}, isTemp: {1}”, theStruct.Status, isTemp.Status); } }  Kết quả: theStruct.Status: -1 Changed object theStruct.Status: Changed interface theStruct.Status: 2, isTemp: Changed object 203 Thực Thi Giao Diện Ngôn Ngữ Lập Trình C# theStruct.Status: 6, isTemp: Trong ví dụ 8.6, giao diện IStorable có phương thức Read() mơt thuộc tính Status Giao diện thực thi cấu trúc tên myStruct: public struct myStruct : IStorable Đoạn mã nguồn thú vị bên Tester Chúng ta bắt đầu việc tạo thể cấu trúc khởi tạo thuộc tính –1, sau giá trị status in ra:0 myStruct theStruct = new myStruct(); theStruct.Status = -1; // khởi tạo Console.WriteLine(“theStruct.Status: {0}”, theStruct.status); Kết giá trị status thiết lập: theStruct.Status = -1; Kế tiếp truy cập thuộc tính để thay đổi status, lần thơng qua đối tượng giá trị: // thay đổi giá trị theStruct.Status = 2; Console.WriteLine(“Changed object”); Console.WriteLine(“theStruct.Status: {0}”, theStruct.Status); kết thay đổi: Changed object theStruct.Status: Tại điểm này, tạo tham chiếu đến giao diện IStorable, đối tượng giá trị theStruct boxing ngầm gán lại cho tham chiếu giao diện Sau dùng giao diện để thay đổi giá trị status 4: // 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); thấy kết thực có điểm khác biệt: Changed interface theStruct.Status: 2, isTemp: Điều xảy là: đối tượng giao diện tham chiếu đến thay đổi giá trị status 4, đối tượng giá trị cấu trúc không thay đổi.Thậm chí có nhiều thú vị truy cập phương thức thông qua thân đối tượng: 204 Thực Thi Giao Diện Ngơn Ngữ Lập Trình C# // than đổi giá trị lần theStruct.Status = 6; Console.WriteLine(“Changed object”); Console.WriteLine(“theStruct.Status: {0}, isTemp: {1}”, theStruct.Status, isTemp.Status); kết đối tượng giá trị thay đổi đối tượng boxing giao diện tham chịếu không thay đổi: Changed object theStruct.Status: 6, isTemp: Ta thử xem đoạn mã IL để hiểu tham cách thực trên:  Ví dụ 8.7: MSIL phát sinh từ ví dụ 8.6 method private hidebysig static void Main() il managed { entrypoint // Code size 206 (0xce) maxstack local ([0] value class myStruct theStruct, [1] class IStorable isTemp, [2] int32 V_2) IL_0000: ldloca.s theStruct IL_0002: iniobj myStruct IL_0008: ldloca.s theStruct IL_000a: ldc.i4.ml IL_000b: call instance void myStruct::set_status(int32) IL_0010: ldstr “theStruct.Status: {0}” IL_0015: ldloca.s theStruct IL_0017: call instance int32 myStruct::get_status() IL_001c: stloc.2 IL_001d: ldloca.s V_2 IL_001f: box [mscorlib]System.Int32 IL_0024: call void [mscorlib] System.Console::WriteLine (class System.String, class System.Object) IL_0029: ldloca.s IL_002b: ldc.i4.2 IL_002c: call theStruct instance void myStruct::set_status(int32) 205 Thực Thi Giao Diện Ngơn Ngữ Lập Trình C# IL_0031: ldstr “Changed object” IL_0036: call void [mscorlib]System.Console::WriteLine (class System.String) IL_003b: ldstr “theStruct.Status: {0}” IL_0040: ldloca.s theStruct IL_0042: call instance int32 myStruct::get_status() IL_0047: stloc.2 IL_0048: ldloca.s V_2 IL_004a: box [mscorlib]System.Int32 IL_004f: call void [mscorlib]System.Console::WriteLine (class System.String, class System.Object) IL_0054: ldloca.s theStruct IL_0056: box myStruct IL_005b: stloc.1 IL_005c: ldloc.1 IL_005d: ldc.i4.4 IL_005e: callvirt instance void IStorable::set_status(int32) IL_0063: ldstr “Changed interface” IL_0068: call void [mscorlib]System.Console::WriteLine (class System.String) IL_006d: ldstr “theStruct.Status: {0}, isTemp: {1}” IL_0072: ldloca.s theStruct IL_0074: call instance int32 mySystem::get_status() IL_0079: stloc.2 IL_007a: ldloca.s V_2 IL_007c: box [mscorlib]System.Int32 IL_0081: ldloc.1 IL_0082: callvirt IL_0087: stloc.2 IL_0088: ldloca.s V_2 IL_008a: box [mscorlib]System.Int32 IL_008f: call void [mscorlib]System.Console::WriteLine instance int32 IStorable::get_status() (class System.String, class System.Object, class System.Object) IL_0094: ldloca.s theStruct IL_0096: ldc.i4.6 IL_0097: call instance void myStruct::set_status(int32) IL_009c: ldstr “Changed object” IL_00a1: call void [mscorlib]System.Console::WriteLine 206 Thực Thi Giao Diện Ngơn Ngữ Lập Trình C# (class System.String) IL_00a6: ldstr “theStruct.Status: {0}, isTemp: {1}” IL_00ab: ldloca.s theStruct IL_00ad: call instance int32 myStruct::get_status() IL_00b2: stloc.2 IL_00b3: ldloca.s V_2 IL_00b5: box [mscorlib]System.Int32 IL_00ba: ldloc.1 IL_00bb: callvirt IL_00c0: stloc.2 IL_00c1: ldloca.s V_2 IL_00c3: box [mscorlib]System.Int32 IL_00c8: call void [mscorlib]System.Console::WriteLine instance int32 IStorable::get_status() (class System.String, class System.Object, class System.Object) IL_00cd: ret } // end fo method Tester::Main Trong dòng lệnh IL_00b, giá trị status thiết lập thông qua việc gọi đối tượng giá trị Tiếp theo thấy lệnh gọi thứ hai dòng IL_0017 Lưu ý việc gọi WriteLine() dẫn đến việc boxing giá trị nguyên để phương thức GetString lớp object gọi Điều muốn nhấn mạnh dòng lệnh IL_0056 cấu trúc myStruct boxing Việc boxing tạo kiểu lịêu tham chiếu cho tham chiếu giao diện Và điều quan trọng dòng IL_005e lúc IStorable::set_status gọi khơng phải myStruct::setStatus Điều quan trọng muốn trình bày thực thi giao diện với kiểu giá trị, phải chắn truy cập thành viên giao diện thông qua đối tượng thông qua tham chiếu giao diện Câu hỏi trả lời Câu hỏi 1: So sánh lớp giao diện? Trả lời 1: Giao diện khác với lớp số điểm sau: giao diện không cung cấp thực thi mã nguồn Điều thực lớp thực thi giao diện Một giao diện đưa để nói có cung cấp số xác nhận hướng dẫn cho điều xảy khơng vào chi tiết Một điều khác tất thành viên giao diện giả sử public ngầm định Nếu cố thay đổi thuộc tính truy cập thành viên giao diện nhận lỗi Giao diện chứa phương thức, thuộc tính, kiện, mục Và không chứa liệu thành viên, khởi dựng, hủy Chúng không chứa thành viên static 207 Thực Thi Giao Diện ... tạo tham chiếu đến giao diện IStorable, đối tượng giá trị theStruct boxing ngầm gán lại cho tham chiếu giao diện Sau dùng giao diện để thay đổi giá trị status 4: // gán cho giao diện // boxing ngầm... là: đối tượng giao diện tham chiếu đến thay đổi giá trị status 4, đối tượng giá trị cấu trúc khơng thay đổi.Thậm chí có nhiều thú vị truy cập phương thức thông qua thân đối tượng: 204 Thực Thi Giao. .. cập thành viên giao diện thông qua đối tượng thông qua tham chiếu giao diện Câu hỏi trả lời Câu hỏi 1: So sánh lớp giao diện? Trả lời 1: Giao diện khác với lớp số điểm sau: giao diện không cung

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

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

TÀI LIỆU LIÊN QUAN