Thứ Sáu, 15 tháng 11, 2013

Thực thi giao diện – Phần 2


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.
Mở rộng giao diện
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:
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ệnIloggedCompressible. 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ệnIstorableCompressible. Giao diện mới này sẽ kết hợp những 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:
Ví dụ 8.2: Minh họa việc mở rộng và kết hợp các giao diện.
Kết quả:
Ví dụ 8.2 bắt đầu bằng việc thực thi giao diện Istorable và giao diện Icompressible. Sau đó là phần mở rộng đến giao diện IloggedCompressible rồi sau đó kết hợp cả hai vào giao diện IstorableCompressible. Và giao diện cuối cùng trong ví dụ là Iencrypt.
Chương trình Tester tạo đối tượng Document mới và sau đó gán lần lượt vào các giao diện khác nhau. Khi một đối tượng được gán cho giao diện IloggedCompressible, chúng ta có thể dùng giao diện này để gọi các phương thức của giao diện Icompressible bởi vì ILogged- Compressible mở rộng và thừa kế các phương thức từ giao diện cơ sở:
Tuy nhiên, ở đây chúng ta không thể gọi phương thức Read() bởi vì phương thức này của giao diệnIstorable, không liên quan đến giao diện này. Nếu chúng ta thêm lệnh này vào thì chương trình sẽ biên dịch lỗi.
Nếu chúng ta gán vào giao diện IstorableCompressible, do giao diện này kết hợp hai giao diệnIstorable và giao diện Icompressible, chúng ta có thể gọi tất cả những phương thức củaIstorableCompressibleIcompressible, và Istorable:
Truy cập phương thức giao diện
Chúng ta có thể truy cập những thành viên của giao diện Istorable như thể là các thành viên của lớpDocument:
hay là ta có thể tạo thể hiện của giao diện bằng cách gán đối tượng Document cho một kiểu dữ liệu giao diện, và sau đó sử dụng giao diện này để truy cập các phương thức:
Ghi chú: Cũng như đã nói trước đây, chúng ta không thể tạo thể hiện của giao diện một cách trực tiếp.Do đó chúng ta không thể thực hiện như sau:
Tuy nhiên chúng ta có thể tạo thể hiện của lớp thực thi như sau:
Sau đó chúng ta có thể tạo thể hiện của giao diện bằng cách gán đối tượng thực thi đến kiểu dữ liệu giao diện, trong trường hợp này là Istorable:
Chúng ta có thể kết hợp những bước trên như sau:
Nói chung, cách thiết kế tốt nhất là quyết định truy cập những phương thức của giao diện thông qua tham chiếu của giao diện. Do vậy cách tốt nhất là sử dụng isDoc.Read(), hơn là sử dụng doc.Read() trong ví dụ trước. Truy cập thông qua giao diện cho phép chúng ta đối xử giao diện một cách đa hình. Nói cách khác, chúng ta tạo hai hay nhiều hơn những lớp thực thi giao diện, và sau đó bằng cách truy cập lớp này chỉ thông qua giao diện.
Hết phần 2

0 nhận xét:

Đăng nhận xét