Danh mục

Giao diện

Số trang: 12      Loại file: pdf      Dung lượng: 105.50 KB      Lượt xem: 17      Lượt tải: 0    
Thư viện của tui

Phí tải xuống: miễn phí Tải xuống file đầy đủ (12 trang) 0
Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

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...
Nội dung trích xuất từ tài liệu:
Giao diện Giao diệnC# hỗ trợ giao diện (Interfaces). Khi thừa kế một giao diện, một lớp đangkhai báo sẽ thực thi những hàm nào đó. Chúng ta sẽ minh họa về giao diệnthô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ệckhai báo một lớp Abstract, nhưng nó không cho phép thực thi bất kỳ mộtthành phần nào của giao diện. Một giao diện chỉ có thể chứa những khai báocủ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ànhphầ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ônlà 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áttriển những ví dụ ngắn trình bày mẫu thừa kế giao diện. Ví dụ về nhữngaccount ngân hàng. Chúng ta sẽ viết mã để cho phép các máy điện toánchuyển khoảng qua lại giữa các account. Có nhiều công ty thực thi accountvà đều đồng ý với nhau là phải thi hành một giao diện IBankaccount có cácphươ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ệnIBankAccount.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ỉnhsố lượng này khi tiền được nạp hay rút. Chú ý chúng ta xuất ra một thôngbá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àikhoả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. Tuytrê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àokhá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ácvà 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ầncủ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ộtphươ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étví 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ốnghệt lớp SaverAccount. Điểm nhấn mạnh ở đây là GoldAccount không liênkết với VenusAccount và chúng cùng thực thi mộ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 thichương trìnhChú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ộtgiao diện. Nhưng chúng ta chỉ được gọi những phương thức là thành phầncủa giao diện thông qua sự tham khảo đến giao diện này. Nếu muốn gọinhững phương thức mà không là thành phần trong giao diện thì ta phải thamkhảo đến những kiểu thích hợp. Như ví dụ trên ta có thể thực thi phươngthức ToString() mặc dù nó không là thành phần được khai báo trong giaodiệ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 S ...

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