Giao diện :
C# hỗ trợ giao diện (Interfaces). Khi thừa kế một giao diện, một lớp đang khai báo sẽ thực thi
những hàm nào đó. Chúng ta sẽ minh họa về giao diện thông qua việc giới thiệu một giao diện đã
được Microsoft định nghĩa, System.IDisposable. IDisposable chứa một phương thức Dispose()
dùng để xoá mã.
public interface IDisposable
{
void Dispose();
}
Trên ví dụ trên ta thấy việc khai báo một giao diện làm việc giống như việc khai báo một lớp
Abstract, nhưng nó không cho phép thực thi bất kỳ một thành phần nào của giao diện. Một giao
diện chỉ có thể chứa những khai báo của phương thức, thuộc tính, bộ phận lập mục lục, và sự
kiện.
Bạn không thể khởi tạo một giao diện thực sự mà nó chỉ chứa những thành phần bên trong nó.
Một giao diện thì không có Constructor hay các trường. Một giao diện thì không cho phép chứa
các phương thức nạp chồng.
Nó cũng không cho phép khai báo những bổ từ trên các thành phần trong khi định nghĩa một
giao diện. Các thành phần bên trong một giao diện luôn luôn là public và không thể khai báo
virtual hay static.
Định nghĩa và thi hành một giao diện:
Chúng ta minh họa cách để định nghĩa và sử dụng giao diện bằng việc phát triển những ví dụ
ngắn trình bày mẫu thừa kế giao diện. Ví dụ về những account ngân hàng. Chúng ta sẽ viết mã
để cho phép các máy điện toán chuyển khoảng qua lại giữa các account. Có nhiều công ty thực
thi account và đều đồng ý với nhau là phải thi hành một giao diện IBankaccount có các phương
thức nạp hay rút tiền và thuộc tính trả về số tài khoản.
Để bắt đầu, ta định nghĩa giao diện IBank:
if (balance >= amount)
{
balance -= amount;
return true;
}
Console.WriteLine("Withdrawal attempt failed.");
return false;
}
public decimal Balance
{
get
{
return balance;
}
}
public override string ToString()
{
return String.Format("Venus Bank Saver: Balance = {0,6:C}", balance);
}
}
}
Trong ví dụ trên chúng ta duy trì một trường private balance và điều chỉnh số lượng này khi tiền
được nạp hay rút. Chú ý chúng ta xuất ra một thông báo lỗi khi thao tác rút tiền không thành
công vì thiếu số tiền trong tài khoản.
Xét dòng lệnh sau:
public class SaverAccount : IBankAccount
Chúng ta khai báo lớp SaverAccount thừa kế giao diện IBankAccount. Tuy trên ví dụ trên ta
không nêu rõ ràng lớp SaverAccount thừa kế từ một lớp nào khác nhưng trên thực tế ta có thể
venusAccount.PayIn(200);
venusAccount.Withdraw(100);
Console.WriteLine(venusAccount.ToString());
jupiterAccount.PayIn(500);
jupiterAccount.Withdraw(600);
jupiterAccount.Withdraw(100);
Console.WriteLine(jupiterAccount.ToString());
}
}
}
Kết quả xuất ra là:
Venus Bank Saver: Balance = £100.00
Withdrawal attempt failed.
Jupiter Bank Saver: Balance = £400.00
Xem toàn bộ chương trình trên Thực thi chương trình
Chúng ta có thể trỏ đến bất kỳ thể hiện của bất kỳ lớp nào thực thi cùng một giao diện. Nhưng
chúng ta chỉ được gọi những phương thức là thành phần của giao diện thông qua sự tham khảo
đến giao diện này. Nếu muốn gọi những phương thức mà không là thành phần trong giao diện thì
ta phải tham khảo đến những kiểu thích hợp. Như ví dụ trên ta có thể thực thi phương thức
ToString()
mặc dù nó không là thành phần được khai báo trong giao diện IBankAccount bởi vì nó
là thành phần của System.Object.
Một giao diện có thể tham khảo đến bất kỳ lớp nào thực thi giao diện đó.
Ví dụ ta có một mảng kiểu một giao diện nào đó thì các phần tử của mảng có thể tham khảo đến
bất kỳ lớp nào thực thi giao diện đó:
IBankAccount[] accounts = new IBankAccount[2];
accounts[0] = new SaverAccount();
accounts[1] = new GoldAccount();
Thừa kế giao diện :
return true;
}
Console.WriteLine("Withdrawal attempt failed.");
return false;
}
public decimal Balance
{
get
{
return balance;
}