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

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

Đang tải... (xem toàn văn)

Thông tin tài liệu

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; } } public bool TransferTo(IBankAccount destination, decimal amount) { bool result; if ((result = Withdraw(amount)) == true) destination.PayIn(amount); return result; } public override string ToString() { return String.Format("Jupiter Bank Current Account: Balance = {0,6:C}", balance); } } We can demonstrate the class with this code: static void Main() { IBankAccount venusAccount = new SaverAccount(); ITransferBankAccount jupiterAccount = new CurrentAccount(); venusAccount.PayIn(200); jupiterAccount.PayIn(500); jupiterAccount.TransferTo(venusAccount, 100); Console.WriteLine(venusAccount.ToString()); Console.WriteLine(jupiterAccount.ToString()); } Khi thực thi đoạn mã trên bạn sẽ thấy kết quả như sau: CurrentAccount Venus Bank Saver: Balance = £300.00 Jupiter Bank Current Account: Balance = £400.00 Thực thi chương trình trên   . 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. 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

Ngày đăng: 24/12/2013, 11:15

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan