Danh mục

Những chủ đề tiến bộ trong C# - Delegate – Phần 2

Số trang: 10      Loại file: pdf      Dung lượng: 101.86 KB      Lượt xem: 12      Lượt tải: 0    
Jamona

Hỗ trợ phí lưu trữ khi tải xuống: 1,000 VND Tải xuống file đầy đủ (10 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:

Định nghĩa delegate như sau: delegate bool CompareOp(object lhs, object rhs); Và xây dựng phương thức sort() là : static public void Sort(object [] sortArray, CompareOp gtMethod) Phần hướng dẫn cho phương thức này sẽ nói rõ rằng gtmethod phải tham chiếu đến 1 phương thức static có 2 đối số,và trả về true nếu giá trị của đối số thứ 2 là lớn hơn ( nghĩa là năm sau trong mảng) đối số thứ nhất. mặc dù ta có thể sử dụng delegate ở đây,nhưng cũng có thể giải quyết vấn đề bằng cách sử dụng interface. .NET...
Nội dung trích xuất từ tài liệu:
Những chủ đề tiến bộ trong C# - Delegate – Phần 2 Những chủ đề tiến bộ trong C# Delegate – Phần 2Định nghĩa delegate như sau:delegate bool CompareOp(object lhs, object rhs);Và xây dựng phương thức sort() là :static public void Sort(object [] sortArray, CompareOp gtMethod)Phần hướng dẫn cho phương thức này sẽ nói rõ rằng gtmethod phải thamchiếu đến 1 phương thức static có 2 đối số,và trả về true nếu giá trị của đốisố thứ 2 là lớn hơn ( nghĩa là năm sau trong mảng) đối số thứ nhất.mặc dù ta có thể sử dụng delegate ở đây,nhưng cũng có thể giải quyết vấn đềbằng cách sử dụng interface. .NET xây dựng 1 interface IComparer cho mụcđích này. tuy nhiên , ta sử dụng delegate vì loại vấn đề này thì thường cókhuynh hướng dùng delegate.Sau đây là lớp bublesorter :class BubbleSorter{ static public void Sort(object [] sortArray, CompareOp gtMethod) { for (int i=0 ; iĐể dùng lớp này ta cần định nghĩa 1 số lớp khác mà có thể dùng thiết lậpmảng cần sắp xếp.ví dụ , công ty điện thoại có danh sách tên khách hàng, vàmuốn sắp danh sách theo lương.mỗi nhân viên trình bày bởi thể hiện củamột lớp , Employee:class Employee { private string name; private decimal salary; public Employee(string name, decimal salary) { this.name = name; this.salary = salary; } public override string ToString() { return string.Format(name + , {0:C}, salary); } public static bool RhsIsGreater(object lhs, object rhs) { Employee empLhs = (Employee) lhs; Employee empRhs = (Employee) rhs; return (empRhs.salary > empLhs.salary) ? true : false; } }Lưu ý để phù hợp với dấu ấn của delegate CompareOp, chúng ta phải địnhnghĩa RhsIsGreater trong lớp này lấy 2 đối tượng để tham khảo,hơn là thamkhảo employee như là thông số.điều này có nghĩa là ta phải ép kiểu nhữngthông số vào trong tham khảo employee để thực thi việc so sánh.Bây giờ ta viết mã yêu cầu sắp xếp :using System;namespace Wrox.ProCSharp.AdvancedCSharp{ delegate bool CompareOp(object lhs, object rhs); class MainEntryPoint { static void Main() { Employee [] employees = { new Employee(Karli Watson, 20000), new Employee(Bill Gates, 10000), new Employee(Simon Robinson, 25000), new Employee(Mortimer, (decimal)1000000.38), new Employee(Arabel Jones, 23000), new Employee(Avon from Blakes 7, 50000)}; CompareOp employeeCompareOp = newCompareOp(Employee.RhsIsGreater); BubbleSorter.Sort(employees, employeeCompareOp); for (int i=0 ; iArabel Jones, £23,000.00Simon Robinson, £25,000.00Avon from Blakes 7, £50,000.00Mortimer, £1,000,000.38Multicast delegateĐến lúc này mỗi delegate mà chúng ta sử dụng chỉ gói ghém trong 1 phươngthức đơn gọi.gọi delegate nào thì dùng phương thức đó.nếu ta muốn gọinhiều hơn 1 phương thức, ta cần tạo một lời gọi tường minh xuyên suốtdelegate nhiều hơn một lần.tuy nhiên, 1 delegate có thể gói ghém nhiều hơn1 phương thức. 1 delegate như vậy gọi là multicast delegate. nếu 1 multicastdelegate được gọi, nó sẽ gọi liên tiếp những phương thức theo thứ tự.để làmđiều này, delegate phải trả về là void.nếu ta dùng một delegate có kiểu trả vềlà void , trình biên dịch sẽ coi như đây là một multicast delegate.xem ví dụsau , dù cú pháp giống như trước đây nhưng nó thực sự là một multicastdelegate, operations,delegate void DoubleOp(double value);// delegate double DoubleOp(double value); // cant do this nowclass MainEntryPoint{static void Main(){DoubleOp operations = new DoubleOp(MathOperations.MultiplyByTwo);operations += new DoubleOp(MathOperations.Square);Trong ví dụ trên muốn tham khảo đến 2 phương thức ta dùng mảng delegate.ở đây , đơn giản ta chỉ thêm 2 thao tác này vào trong cùng một multicastdelegate.multiccast delegate nhận toán tử + và +=. nếu ta muốn , ta có thểmở rộng 2 dòng mã trên , có cùng cách tác động :DoubleOp operation1 = new DoubleOp(MathOperations.MultiplyByTwo);DoubleOp operation2 = new DoubleOp(MathOperations.Square);DoubleOp operations = operation1 + operation2;multicast delegate cũng biết toán tử - và -= để bỏ đi phương thức được gọi từdelegate.một muticast delegate là một lớp được dẫn xuất từSystem.MulticastDelegate mà lại được dẫn xuất từ System.Delegate.System.MulticastDelegate có thêm những thành phần để cho phép nối nhữngphương thức gọi cùng với nhau vào một danh sách.Minh hoạ cho sử dụng multicast delegate ta sử dụng lại ví dụsimpleDelegate biến nó thành một ví dụ mới MulticastDelegate. bởi vì ta cầndelegate trả về kiểu void , ta phải viết lại những phương thức trong lớpM ...

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