Danh mục

Hướng Đối Tượng Trong C# part 4

Số trang: 6      Loại file: pdf      Dung lượng: 181.07 KB      Lượt xem: 18      Lượt tải: 0    
Hoai.2512

Xem trước 2 trang đầu tiên của tài liệu này:

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.
Nội dung trích xuất từ tài liệu:
Hướng Đối Tượng Trong C# part 4Giao 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 thinhữ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ớpAbstract, 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 giaodiệ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ứacá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ộtgiao 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áovirtual 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ựcthi account và đều đồng ý với nhau là phải thi hành một giao diện IBankaccount có các phươngthứ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àntoà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ànhcông vì thiếu số tiền trong tài khoản.Xét dòng lệnh sau:public class SaverAccount : IBankAccountChúng ta khai báo lớp SaverAccount thừa kế giao diện IBankAccount. Tuy trên ví dụ trên takhô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, IInterface2Thừa kế từ IBankAccount có nghĩa là SaverAccount lấy tất cả các thành phần của IBankAccountnhư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ủatừ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ớpkhá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 thimột InterfaceBâ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.00Withdrawal attempt failed.Jupiter Bank Saver: Balance = £400.00Xem 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ưngchú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ứcToString() 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 đếnbấ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 ...

Tài liệu được xem nhiều: