Tải bản đầy đủ (.pdf) (6 trang)

Tài liệu Hướng Đối Tượng Trong C# part 4 doc

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (181.07 KB, 6 trang )




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:


namespace Wrox.ProCSharp.OOCSharp.BankProtocols
{
public interface IBankAccount
{
void PayIn(decimal amount);
bool Withdraw(decimal amount);

decimal Balance
{
get;
}
}
}
Chú ý: Tên của giao diện thường phải có ký tự I đứng đầu để nhận biết đó là một giao diện.
Có ý kiến là chúng ta có thể viết các lớp mô tả Account. Những lớp này có thể khác nhau hoàn
toàn. Nhưng trên thực tế chúng đều thực thi giao diện IBankAccount.
Hãy bắt đầu với lớp đầu tiên :
namespace Wrox.ProCSharp.OOCSharp.VenusBank
{
public class SaverAccount : IBankAccount
{
private decimal balance;

public void PayIn(decimal amount)
{
balance += amount;
}

public bool Withdraw(decimal amount)
{

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ể

khai báo một lớp thừa kế từ một lớp khác và nhiều giao diện như sau:
public class MyDerivedClass : MyBaseClass, IInterface1, IInterface2
Thừa kế từ IBankAccount có nghĩa là SaverAccount lấy tất cả các thành phần của IBankAccount
nhưng nó không thể sử dụng các phương thức đó nếu nó không định nghĩa lại các hành động của
từng phương thức. Nếu bỏ quên một phương thức nào thì trình biên dịch sẽ báo lỗi.
Để minh họa cho các lớp khác nhau có thể thực thi cùng một giao diện ta xét ví dụ về một lớp
khác là GoldAccount.
namespace Wrox.ProCSharp.OOCSharp.JupiterBank
{
public class GoldAccount : IBankAccount
{
// etc
}
}
Chúng ta không mô tả chi tiết lơp GoldAccount bởi vì về cơ bản nó giống hệt lớp SaverAccount.
Điểm nhấn mạnh ở đây là GoldAccount không liên kết với VenusAccount và chúng cùng thực thi
một Interface
Bây giờ ta có những lớp và chúng ta kiểm tra chúng:
using Wrox.ProCSharp.OOCSharp.BankProtocols;
using Wrox.ProCSharp.OOCSharp.VenusBank;
using Wrox.ProCSharp.OOCSharp.JupiterBank;
Chúng ta có phương thức main():
namespace Wrox.ProCSharp.OOCSharp
{
class MainEntryPoint
{
static void Main()
{
IBankAccount venusAccount = new SaverAccount();
IBankAccount jupiterAccount = new GoldAccount();

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 :


C# cho phép những giao diện có thể thừa kế các giao diện khác. Khi một giao diện thừa kế một
giao diện khác thì nó có thể thi hành tất cả các phương thức định nghĩa trong giao diện đó và
những phương thức của nó định nghĩa. Ví dụ tao tạo ra một giao diện mới thừa kế giao diện
IBanKAccount :
namespace Wrox.ProCSharp.OOCSharp.BankProtocols
{
public interface ITransferBankAccount : IBankAccount
{
bool TransferTo(IBankAccount destination, decimal amount);
}
}
Như vậy giao diện ITransferBankAccount phải thi hành tất cả các phương thức trong giao diện
IBankAccount và phương thức TransferTo.
Chúng ta sẽ minh hoạ ITransferBankAccount bằng một ví dụ bên dưới về một current account.
Lớp CurrentAccount được định nghĩa gần giống hệt với các lớp SaverAccount và GoldAccount,
vì thế trong đoạn mã bên dưới chúng tôi đã tô màu các dòng khác nhau:
public class CurrentAccount : ITransferBankAccount
{
private decimal balance;

public void PayIn(decimal amount)
{
balance += amount;
}

public bool Withdraw(decimal amount)
{
if (balance >= amount)
{
balance -= amount;

return true;
}
Console.WriteLine("Withdrawal attempt failed.");
return false;
}

public decimal Balance
{
get
{
return balance;
}

×