Ngôn Ngữ Lập Trình C#
public class Document : IStorable
{
public void Read()
{
}
public void Write()
{
}
}
Bây giờ trách nhiệm của chúng ta, với vai trò là người xây dựng lớp Document phải
cung cấp một thực thi có ý nghĩa thực sự cho những phương thức của giao diện IStorable.
Chúng ta phải thực thi tất cả các phương thức của giao diện, nếu không trình biên dịch sẽ báo
một lỗi. Sau đây là đoạn chương trình minh họa việc xây dựng lớp Document thực thi giao
diện IStorable.
Ví dụ 8.1: Sử dụng một giao diện.
using System;
// khai báo giao diện
interface IStorable
{
// giao diện không khai báo bổ sung truy cập
// phương thức là public và không thực thi
void Read();
void Write(object obj);
int Status
{
get;
set;
}
}
// tạo một lớp thực thi giao diện IStorable
public class Document : IStorable
{
public Document( string s)
{
Console.WriteLine(“Creating document with: {0}”, s);
Thực Thi Giao Diện
178
.
.
Ngôn Ngữ Lập Trình C#
}
// thực thi phương thức Read()
public void Read()
{
Console.WriteLine(“Implement the Read Method for IStorable”);
}
// thực thi phương thức Write
public void Write( object o)
{
Console.WriteLine(“Impleting the Write Method for IStorable”);
}
// thực thi thuộc tính
public int Status
{
get
{
return status;
}
set
{
status = value;
}
}
// lưu trữ giá trị thuộc tính
private int status = 0;
}
public class Tester
{
static void Main()
{
// truy cập phương thức trong đối tượng Document
Document doc = new Document(“Test Document”);
doc.Status = -1;
doc.Read();
Console.WriteLine(“Document Status: {0}”, doc.Status);
// gán cho một giao diện và sử dụng giao diện
IStorable isDoc = (IStorable) doc;
isDoc.Status = 0;
Thực Thi Giao Diện
179
.
.
Ngôn Ngữ Lập Trình C#
isDoc.Read();
Console.WriteLine(“IStorable Status: {0}”, isDoc.Status);
}
}
Kết quả:
Creating document with: Test Document
Implementing the Read Method for IStorable
Document Status: -1
Implementing the Read Method for IStorable
IStorable Status: 0
Ví dụ 8.1 định nghĩa một giao diện IStorable với hai phương thức Read(), Write() và một
thuộc tính tên là Status có kiểu là số nguyên Lưu ý rằng trong phần khai báo thuộc tính
không có phần thực thi cho get() và set() mà chỉ đơn giản là khai báo có hành vi là get() và
set():
int Status { get; set;}
Ngoài ra phần định nghĩa các phương thức của giao diện không có phần bổ sung truy cập (ví
dụ như: public, protected, internal, private). Việc cung cấp các bổ sung truy cập sẽ tạo ra
một lỗi. Những phương thức của giao diện được ngầm định là public vì giao diện là những
ràng buộc được sử dụng bởi những lớp khác. Chúng ta không thể tạo một thể hiện của giao
diện, thay vào đó chúng ta sẽ tạo thể hiện của lớp có thực thi giao diện.
Một lớp thực thi giao diện phải đáp ứng đầy đủ và chính xác các ràng buộc đã khai báo trong
giao diện. Lớp Document phải cung cấp cả hai phương thức Read() và Write() cùng với
thuộc tính Status. Tuy nhiên cách thực hiện những yêu cầu này hoàn toàn phụ thuộc vào lớp
Document. Mặc dù IStorage chỉ ra rằng lớp Document phải có một thuộc tính là Status
nhưng nó không biết hay cũng không quan tâm đến việc lớp Document lưu trữ trạng thái thật
sự của các biến thành viên, hay việc tìm kiếm trong cơ sở dữ liệu. Những chi tiết này phụ
thuộc vào phần thực thi của lớp.
Thực thi nhiều giao diện
Trong ngôn ngữ C# cho phép chúng ta thực thi nhiều hơn một giao diện. Ví dụ, nếu lớp
Document có thể được lưu trữ và dữ liệu cũng được nén. Chúng ta có thể chọn thực thi cả hai
giao diện IStorable và ICompressible. Như vậy chúng ta phải thay đổi phần khai báo trong
danh sách cơ sở để chỉ ra rằng cả hai giao diện điều được thực thi, sử dụng dấu phẩy (,) để
phân cách giữa hai giao diện:
public class Document : IStorable, ICompressible
Thực Thi Giao Diện
180
.
.
Ngôn Ngữ Lập Trình C#
Do đó Document cũng phải thực thi những phương thức được xác nhận trong giao diện
ICompressible:
public void Compress()
{
Console.WriteLine(“Implementing the Compress Method”);
}
public void Decompress()
{
Console.WriteLine(“Implementing the Decompress Method”);
}
Bổ sung thêm phần khai báo giao diện ICompressible và định nghĩa các phương thức của
giao diện bên trong lớp Document. Sau khi tạo thể hiện lớp Document và gọi các phương
thức từ giao diện ta có kết quả tương tự như sau:
Creating document with: Test Document
Implementing the Read Method for IStorable
Implementing Compress
Mở rộng giao diện
C# cung cấp chức năng cho chúng ta mở rộng một giao diện đã có bằng cách thêm các
phương thức và các thành viên hay bổ sung cách làm việc cho các thành viên. Ví dụ, chúng ta
có thể mở rộng giao diện ICompressible với một giao diện mới là ILoggedCompressible.
Giao diện mới này mở rộng giao diện cũ bằng cách thêm phương thức ghi log các dữ liệu đã
lưu:
interface ILoggedCompressible : ICompressible
{
void LogSavedBytes();
}
Các lớp khác có thể thực thi tự do giao diện ICompressible hay ILoggedCompressible tùy
thuộc vào mục đích có cần thêm chức năng hay không. Nếu một lớp thực thi giao diện
ILoggedCompressible, thì lớp này phải thực thi tất cả các phương thức của cả hai giao diện
ICompressible và giao diện ILoggedCompressible. Những đối tượng của lớp thực thi giao
diện ILoggedCompressible có thể được gán cho cả hai giao diện ILoggedCompressible và
ICompressible.
Kết hợp các giao diện
Một cách tương tự, chúng ta có thể tạo giao diện mới bằng cách kết hợp các giao diện
cũ và ta có thể thêm các phương thức hay các thuộc tính cho giao diện mới. Ví dụ, chúng ta
quyết định tạo một giao diện IStorableCompressible. Giao diện mới này sẽ kết hợp những
Thực Thi Giao Diện
181
.
.
Ngôn Ngữ Lập Trình C#
phương thức của cả hai giao diện và cũng thêm vào một phương thức mới để lưu trữ kích
thước nguyên thuỷ của các dữ liệu trước khi nén:
interface IStorableCompressible : IStoreable, ILoggedCompressible
{
void LogOriginalSize();
}
Ví dụ 8.2: Minh họa việc mở rộng và kết hợp các giao diện.
using System;
interface IStorable
{
void Read();
void Write(object obj);
int Status { get; set;}
}
// giao diện mới
interface ICompressible
{
void Compress();
void Decompress();
}
// mở rộng giao diện
interface ILoggedCompressible : ICompressible
{
void LogSavedBytes();
}
// kết hợp giao diện
interface IStorableCompressible : IStorable, ILoggedCompressible
{
void LogOriginalSize();
}
interface IEncryptable
{
void Encrypt();
void Decrypt();
}
public class Document : IStorableCompressible, IEncryptable
{
Thực Thi Giao Diện
182
.
.