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)
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ụ sử dụng IComparable
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
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
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ụ
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ụ
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
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ụ nhiều lớp thực thi interface