Bài 6 : Interface - Nền tảng lập trình C#


Có rất nhiều vấn đề đật ra như interface dùng để làm gì, tại sao dùng interface, dùng interface như thế nào,…


Khái niệm lớp giao tiếp

  • Khai báo 1 tập các thành phần (thuộc tính ph , phương thức): chỉ khai báo, nhưng không thực thi
  • Các lớp thực thi interface phải cung cấp định nghĩa các thành phần mà interface khai báo
  • Interface là một kiểu tham chiếu (reference type)

Khái niệm lớp giao tiếp

Interface ICompareable

  • Không thực thi phương thức CompareTo
  • Cung cấp mô tả chức năng phương thức CompareTo
  • Khi gọi, CompareTo trả về các giá trị:
    • < 0: đối tượng hiện hành < đối tượng truyền vào
    • > 0: đối tượng hiện hành > đối tượng y truyền vào
    • = 0: đối tượng hiện hành = đối tượng truyền vào

Ví dụ sử dụng IComparable

ví dụ icomparable

Ví dụ sử dụng IComparable

ví dụ icomparable 2

Thực thi interface IComparable

  • Khai báo interface khi khai báo lớp
  • Cung cấp thực thi tất cả các thành phần của interface trong khai báo lớp
class MyClass : ICompareable
{
    public int TheValue;
    public int CompareTo(object obj){
        MyClass mc = (MyClass)obj;
        if (this.TheValue < mc.TheValue) return -1;
        if (this.TheValue > mc.TheValue) return 1;
        return 0;
    }
}

Khai báo và khởi tạo lớp giao tiếp

Các lưu ý khi khai báo interface

  • Khai báo interface không chứa các thành phần dữ liệu
  • Khai báo interface chỉ chứa các khai báo của các non-static function member.
    • Phương thức (methods)
    • Thuộc tính (properties)
    • Sự kiện (events)
    • Chỉ mục (indexers)
  • Chỉ khai báo các thành phần, không khai báo code thực thi 10
  • Tên interface nên bắt đầu bằng I (ví dụ IComparable)

Ví dụ:

Khai báo interface có thể dùng các bổ từ truy xuất như public, private, protected, internal.
Các thành phần của interface mặc định là public và không 11 được dùng bổ từ truy xuất

interface MyInterface1{
   int DoStuff(int nVar1 int nVar2);
   double DoOtherStuff(string s,long x);
}

Thực thi interface 

  • Chỉ có các class/ struct có thể thực thi interface
  • Khi thực thi interface, các class/ struct phải
    • Thêm khai báo interface vào khai báo class/ struct
    • Thực thi tất cả các thành phần của interface trong class/ struct

Ví dụ:

class MyClass : MyInterface1
{
    int DoStuff(int nVar1, long nVar2){
        // implement code
    }
    double DoOtherStuff(string s, long x){
        // implement code
    }
}

Lưu ý Khai báo và khởi tạo lớp giao tiếp

  • Nếu một lớp thực thi interface, nó phải thực thi hết tất cả các thành phần của interface
  • Nếu lớp được dẫn xuất từ lớp cơ sở và có thực thi interface : tên lớp cơ sở phải đặt trước các tên interface trong khai báo lớp

Lưu ý khai báo và khởi tạo lớp giao tiếp

Interface là một kiểu tham chiếu (reference type)

  • Không thể truy xuất interface trực tiếp thông qua các thành phần của đối tượng thuộc lớp
  • Có thể tham chiếu đến interface thông qua ép kiểu của đối tượng thuộc lớp sang kiểu interface

interface là một kiểu tham chiếu

Sử dụng toán tử As với interface

  • Ép kiểu một đối tượng sang kiểu interface mà nó không thực thi sẽ phát sinh ngoại lệ (lỗi)
  • Sử dụng toán tử As:
    • Nếu lớp có thực thi interface: trả về tham chiếu đến interface
    • Nếu lớp không thực thi interface: trả về null (không phát sinh ngoại lệ)

Ví dụ

Sử dụng toán tử as với interface

Sử dụng toán tử as với interface 2

Sử dụng toán tử as với interface 3

Thực thi nhiều interface

  • Một class/ struct có thể thực thi nhiều interface
  • Các interface được thực thi phải được liệt kê trên khai báo lớp và cách nhau bởi dấu phẩy (",")

Ví dụ

Ví dụ thực thi nhiều interface

Thực thi interface với các thành phần giống nhau

interface IIfc1{
    void PrintOut(string s);
}
class MyClass : IIfc1, IIfc2{
    public void PrintOut(string s){
        Console.WriteLine("Calling through: {0}", s);
    }
}
interface IIfc2{
    void PrintOut(string t);
}

class Program{
    static void Main(string[] args){
        MyClass mc = new MyClass();
        mc.PrintOut("Object");
        Console.Read();
    }
}

Tham chiếu đến nhiều interfaceTa có thể gọi phương thức PrintOut theo 3 cách:

  • Từ đối tượng thuộc lớp MyClass
  • Từ tham chiếu đến interface IIfc1
  • Từ tham chiếu đến interface IIfc2

Ví dụ tham chiếu đến nhiều interface

Kế thừa Interface

  • Một interface có thể được kế thừa từ 1/nhiều interface
  • Chỉ định 1 interface kế thừa từ các interface khác:
    • Thêm danh sách các interface kế thừa vào khai báo interface
    • Các interface cách nhau bởi dấu phẩy (,)
interface IDataIO : IDataRetrieve, IDataStore
{
...
}

 Ví dụ
Ví dụ kế thừa interface

Ví dụ nhiều lớp thực thi interface

Ví dụ nhiều lớp thực thi interface

Chia sẽ bài viết :


Bài viết liên quan