Thứ Hai, 19 tháng 4, 2010

// // Leave a Comment

Interface - Giao diện trong C#

1. Định nghĩa interface (giao diện)

Giao diện là ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho các thành phần client biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong giao diện.

Một giao diện thì giống như một lớp chỉ chứa các phương thức trừu tượng. Một lớp trừu tượng được dùng làm lớp cơ sở cho một họ các lớp dẫn xuất từ nó. Trong khi giao diện là sự trộn lẫn với các cây kế thừa khác.

Tuy nhiên bạn phải hiểu là giao diện không phải là lớp.
Sau đây sẽ giới thiệu với bạn cách định nghĩa và thực thi một giao diện
Cú pháp để định nghĩa một giao diện như sau:


 [thuộc tính] [phạm vi truy cập] interface <tên giao diện> [: danh sách cơ sở]
 {
  /* phần thân giao diện */
 }


Phần thuộc tính chúng ta chưa đề cập tới các bạn hãy lưu ý đến phần phạm vi truy cập bao gồm public, private, protected, internal, và protected internal đã được nói đến. Theo sau từ khóa interface là tên của giao diện. Thông thường tên của giao diện được bắt đầu với từ I hoa (điều này không bắt buộc nhưng việc đặt tên như vậy rất rõ ràng và dễ hiểu, tránh nhầm lẫn với các thành phần khác).

Danh sách cơ sở là danh sách các giao diện mà giao diện này mở rộng, phần này sẽ được trình bày trong phần thực thi nhiều giao diện. Phần thân của giao diện chính là phần thực thi giao diện.

2. Thực thi giao diện

Giả sử chúng ta muốn tạo một giao diện nhằm mô tả những phương thức và thuộc tính của một lớp cần thiết để lưu trữ và truy cập từ một cơ sở dữ liệu hay các thành phần lưu trữ dữ liệu khác như là một tập tin. Chúng ta quyết định gọi giao diện này là IStorage. Trong giao diện này chúng ta xác nhận hai phương thức: Read() và Write(), khai báo này sẽ được xuất hiện trong phần thân của giao diện như sau:


    interface IStorable
    {
        void Read();
        void Write(object);
    }


Mục đích của một giao diện là để định nghĩa những khả năng mà chúng ta muốn có trong một lớp. Ví dụ, chúng ta có thể tạo một lớp tên là Document, lớp này lưu trữ các dữ liệu trong cơ sở dữ liệu, do đó chúng ta quyết định lớp này này thực thi giao diện IStorable. Để làm được điều này, chúng ta sử dụng cú pháp giống như việc tạo một lớp mới Document được thừa kế từ IStorable bằng dùng dấu hai chấm (:) và theo sau là tên giao diện:


    public class Document : IStorable
    {
        public void Read()
        {
            // ...
        }
        public void Write()
        {
            //...
        }
    }



Dưới đây là code minh họa việc thực thi 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 (chỉ khai báo)
        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 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;
            }
        }

        // khai báo trường dữ liệu status
        private int status = 0;
    }

    public class Tester
    {
        static void Main()
        {
            // khởi tạo đối tượng Document
            Document doc = new Document("Test Document");
            doc.Status = -1;
            doc.Read();
            Console.WriteLine("Document Status: {0}", doc.Status);

            // khởi gán một giao diện
            IStorable isDoc = (IStorable) doc;
            isDoc.Status = 0;
            isDoc.Read();

            Console.WriteLine("IStorable Status: {0}", isDoc.Status);
            Console.ReadLine();
        }
    }

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



Khi đó lớp Document phải thực hiện đầy đủ các method được khai báo trong ICompressible.
4. 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();
    }

5. Kết hợp 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 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();
    }

Các bạn đã được làm quen với một khái niệm nữa trong C# đó là giao diện (interface). Cách định nghĩa và thực thi một interface, các thực thi nhiều interface, mở rộng và kết hợp các interface.

0 comments: