Siêu thị PDFTải ngay đi em, trời tối mất

Thư viện tri thức trực tuyến

Kho tài liệu với 50,000+ tài liệu học thuật

© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Ngôn ngữ Csharp phần 6 ppt
MIỄN PHÍ
Số trang
40
Kích thước
1.8 MB
Định dạng
PDF
Lượt xem
1414

Ngôn ngữ Csharp phần 6 ppt

Nội dung xem thử

Mô tả chi tiết

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ớ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();

}

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ường

minh. 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ủa

phươ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ị

Thực Thi Giao Diện

201

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 giao

diệ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ớp

khô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ương

thứ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ột

kiể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 định

củ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 đối

tượ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ếu

chú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 đơn

interface IStorable

{

void Read();

int Status { get; set;}

}

// thực thi thông qua cấu trúc

public struct myStruct : IStorable

{

public void Read()

{

Console.WriteLine(“Implementing IStorable.Read”);

}

public int Status

{

get

{

return status;

}

set

{

status = value;

}

}

Thực Thi Giao Diện

202

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: -1

Changed object.

theStruct.Status: 2

Changed interface

theStruct.Status: 2, isTemp: 4

Changed object

Thực Thi Giao Diện

203

Ngôn Ngữ Lập Trình C#

theStruct.Status: 6, isTemp: 4

-----------------------------------------------------------------------------

Trong ví dụ 8.6, giao diện IStorable có một phương thức Read() và môt thuộc tính là Status.

Giao diện này được thực thi bởi một cấu trúc tên là myStruct:

public struct myStruct : IStorable

Đoạn mã nguồn thú vị bên trong Tester. Chúng ta bắt đầu bằng việc tạo một thể hiện của cấu

trúc và khởi tạo thuộc tính là –1, sau đó giá trị của status được in ra:0

myStruct theStruct = new myStruct();

theStruct.Status = -1; // khởi tạo

Console.WriteLine(“theStruct.Status: {0}”, theStruct.status);

Kết quả là giá trị của status được thiết lập:

theStruct.Status = -1;

Kế tiếp chúng ta truy cập thuộc tính để thay đổi status, một lần nữa 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 quả chỉ ra sự thay đổi:

Changed object

theStruct.Status: 2

Tại điểm này, chúng ta tạo ra một tham chiếu đến giao diện IStorable, một đối tượng giá

trị theStruct được boxing ngầm và gán lại cho tham chiếu giao diện. Sau đó chúng ta dùng

giao diện để thay đổi giá trị của status bằng 4:

// gán cho một 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);

như chúng ta đã thấy kết quả thực hiện có một điểm khác biệt:

Changed interface

theStruct.Status: 2, isTemp: 4

Điều xảy ra là: đối tượng được giao diện tham chiếu đến thay đổi giá trị status bằng 4, nhưng

đối tượng giá trị cấu trúc không thay đổi.Thậm chí có nhiều thú vị hơn khi chúng ta truy cập

phương thức thông qua bản thân đối tượng:

Thực Thi Giao Diện

204

Tải ngay đi em, còn do dự, trời tối mất!