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