Tìm hiểu C# và ứng dụng của C# p 16
Số trang: 8
Loại file: pdf
Dung lượng: 4.47 MB
Lượt xem: 5
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Chương 12 Delegate và Event ( Tiếp theo)12.1.2 Delegate tĩnhĐiểm bất lợi của ví dụ 12-1 là nó buộc lớp gọi, trong trường hợp này là lớp Test, phải khởi tạo các delegate nó cần để sắp thứ tự các đối tượng trong một cặp. Sẽ tốt hơn nếu như có thể lấy các delegate từ lớp Dog và Student. Chúng ta có thể làm điều này bằng cách tạo cho trong mỗi lớp một delegate tĩnh. Đối với lớp Student ta thêm như sau:public static readonly Pair.WhichIsFirst OrderStudents = new Pair.WhichIsFirst(Student.WhichStudentComesFirst);Dòng lệnh này tạo một delegate tĩnh, chỉ đọc...
Nội dung trích xuất từ tài liệu:
Tìm hiểu C# và ứng dụng của C# p 16Delegate và Event Gvhd: Nguyễn Tấn Trần Minh Khang12.1.2 Delegate tĩnhĐiểm bất lợi của ví dụ 12-1 là nó buộc lớp gọi, trong trường hợp này là lớp Test,phải khởi tạo các delegate nó cần để sắp thứ tự các đối tượng trong một cặp. Sẽtốt hơn nếu như có thể lấy các delegate từ lớp Dog và Student. Chúng ta có thểlàm điều này bằng cách tạo cho trong mỗi lớp một delegate tĩnh. Đối với lớpStudent ta thêm như sau: public static readonly Pair.WhichIsFirst OrderStudents = new Pair.WhichIsFirst(Student.WhichStudentComesFirst);Dòng lệnh này tạo một delegate tĩnh, chỉ đọc có tên là OrderStudentTa có thể tạo tương tự cho lớp Dog public static readonly Pair.WhichIsFirst OrderDogs = new Pair.WhichIsFirst(Dog. WhichDogComesFirst); 94Delegate và Event Gvhd: Nguyễn Tấn Trần Minh Khang Như vậy mỗi lớp có một delegate riêng, khi cần ta lấy các delegate này và truyền như tham số. studentPair.Sort(theStudentDelegate); Console.WriteLine(After Sort studentPair : {0}, studentPair.ToString( )); studentPair.ReverseSort(Student.OrderStudents); Console.WriteLine(After ReverseSort studentPair : {0}, studentPair.ToString( )); dogPair.Sort(Dog.OrderDogs); Console.WriteLine(After Sort dogPair : {0}, dogPair.ToString( )); dogPair.ReverseSort(Dog.OrderDogs); Console.WriteLine(After ReverseSort dogPair.ToString( )); Kết quả hoàn toàn như ví dụ trên. 12.1.3 Delegate như Property Một vấn đề với delagate tĩnh là nó phải được khởi tạo trước, cho dù có được dùng hay không. Ta có thể cải tiến bằng cách thay đổi biến thành viên tĩnh thành property Đối với lớp Student, ta bỏ khai báo sau: public static readonly Pair.WhichIsFirst OrderStudents = new Pair.WhichIsFirst(Student.WhichStudentComesFirst); và thay thế bằng public static Pair.WhichIsFirst OrderStudents { get{ return new Pair.WhichIsFirst(WhichStudentComesFirst); } } Tương tự thay thế cho lớp Dog public static Pair.WhichIsFirst OrderDogs { get{ return new Pair.WhichIsFirst(WhichDogComesFirst);} } Khi property OrderStudent được truy cập, delegate sẽ được tạo: return new Pair.WhichIsFirst(WhichStudentComesFirst); Khác biệt chính ở đây là delegate sẽ chỉ được khởi tạo khi có yêu cầu.12.1.4 Thứ tự thực thi với mảng các các delegateDelegate có thể giúp ta xậy dựng một hệ thống cho phép người dùng có thể quyếtđịnh một cách động trình tự thực thi các thao tác. Giả sử chúng ta có hệ thống sử lýảnh, hệ thống này có thể thao tác ảnh theo nhiều cách như: làm mờ (blur) ảnh, làmsắc nét, quay, lọc v.v…ảnh. Cũng giả sử rằng trình tự áp dụng các hiệu ứng trên ảnhhưởng lớn đến đến chất lượng của ảnh. Người dùng sẽ mong muốn chọn các hiệuứng họ lẫn trình tự của chúng từ một thực đơn, sau đó hệ thống sẽ thực hiện cáchiệu ứng này theo trình tự họ đã định. 95Delegate và Event Gvhd: Nguyễn Tấn Trần Minh KhangTa có thể tạo một delegate cho mỗi thao tác (hiệu ứng) và đẩy chúng vào một túichứa có thứ tự, như một mảng chẳng hạn, theo đúng trình tự nó sẽ được thực thi.Khi tất cả các delegate được tạo và thêm vào túi chứa, ta chỉ đơn giản duyệt suốtmảng, gọi các delegate khi tới lượt.Ta bắt đầu tạo lớp Image để đại diện cho một bức ảnh sẽ được xử lý bởiImageProcessor: public class Image { public Image( ) { Console.WriteLine(An image created); } }Lớp ImageProcessor khai báo một delegate không tham số và trả về kiểuvoid public delegate void DoEffect( );Sau đó khai báo một số phương thức để thao tác ảnh có nguyên mẫu hàm nhưdelegate đã khai báo ở trên. public static void Blur( ) { Console.WriteLine(Blurring image); } public static void Filter( ) { Console.WriteLine(Filtering image); } public static void Sharpen( ) { Console.WriteLine(Sharpening image); } public static void Rotate( ) { Console.WriteLine(Rotating image); }Lớp ImageProccessor cần một mảng để giữ các delegate người dùng chọn;một biến để giữ số lượng hiệu ứng muốn xử lý và hiển nhiên một bức ảnh image DoEffect[] arrayOfEffects; Image image; int numEffectsRegistered = 0;ImageProccessor cũng cần một phương thức để thêm delegate vào mảng public void AddToEffects(DoEffect theEffect) { if (numEffectsRegistered >= 10) { throw new Exception(Too many members in array); } arrayOfEffects[numEffectsRegistered++] = theEffect; } 96Delegate và Event Gvhd: Nguyễn Tấn Trần Minh KhangMột phương thức để gọi thực thi các ...
Nội dung trích xuất từ tài liệu:
Tìm hiểu C# và ứng dụng của C# p 16Delegate và Event Gvhd: Nguyễn Tấn Trần Minh Khang12.1.2 Delegate tĩnhĐiểm bất lợi của ví dụ 12-1 là nó buộc lớp gọi, trong trường hợp này là lớp Test,phải khởi tạo các delegate nó cần để sắp thứ tự các đối tượng trong một cặp. Sẽtốt hơn nếu như có thể lấy các delegate từ lớp Dog và Student. Chúng ta có thểlàm điều này bằng cách tạo cho trong mỗi lớp một delegate tĩnh. Đối với lớpStudent ta thêm như sau: public static readonly Pair.WhichIsFirst OrderStudents = new Pair.WhichIsFirst(Student.WhichStudentComesFirst);Dòng lệnh này tạo một delegate tĩnh, chỉ đọc có tên là OrderStudentTa có thể tạo tương tự cho lớp Dog public static readonly Pair.WhichIsFirst OrderDogs = new Pair.WhichIsFirst(Dog. WhichDogComesFirst); 94Delegate và Event Gvhd: Nguyễn Tấn Trần Minh Khang Như vậy mỗi lớp có một delegate riêng, khi cần ta lấy các delegate này và truyền như tham số. studentPair.Sort(theStudentDelegate); Console.WriteLine(After Sort studentPair : {0}, studentPair.ToString( )); studentPair.ReverseSort(Student.OrderStudents); Console.WriteLine(After ReverseSort studentPair : {0}, studentPair.ToString( )); dogPair.Sort(Dog.OrderDogs); Console.WriteLine(After Sort dogPair : {0}, dogPair.ToString( )); dogPair.ReverseSort(Dog.OrderDogs); Console.WriteLine(After ReverseSort dogPair.ToString( )); Kết quả hoàn toàn như ví dụ trên. 12.1.3 Delegate như Property Một vấn đề với delagate tĩnh là nó phải được khởi tạo trước, cho dù có được dùng hay không. Ta có thể cải tiến bằng cách thay đổi biến thành viên tĩnh thành property Đối với lớp Student, ta bỏ khai báo sau: public static readonly Pair.WhichIsFirst OrderStudents = new Pair.WhichIsFirst(Student.WhichStudentComesFirst); và thay thế bằng public static Pair.WhichIsFirst OrderStudents { get{ return new Pair.WhichIsFirst(WhichStudentComesFirst); } } Tương tự thay thế cho lớp Dog public static Pair.WhichIsFirst OrderDogs { get{ return new Pair.WhichIsFirst(WhichDogComesFirst);} } Khi property OrderStudent được truy cập, delegate sẽ được tạo: return new Pair.WhichIsFirst(WhichStudentComesFirst); Khác biệt chính ở đây là delegate sẽ chỉ được khởi tạo khi có yêu cầu.12.1.4 Thứ tự thực thi với mảng các các delegateDelegate có thể giúp ta xậy dựng một hệ thống cho phép người dùng có thể quyếtđịnh một cách động trình tự thực thi các thao tác. Giả sử chúng ta có hệ thống sử lýảnh, hệ thống này có thể thao tác ảnh theo nhiều cách như: làm mờ (blur) ảnh, làmsắc nét, quay, lọc v.v…ảnh. Cũng giả sử rằng trình tự áp dụng các hiệu ứng trên ảnhhưởng lớn đến đến chất lượng của ảnh. Người dùng sẽ mong muốn chọn các hiệuứng họ lẫn trình tự của chúng từ một thực đơn, sau đó hệ thống sẽ thực hiện cáchiệu ứng này theo trình tự họ đã định. 95Delegate và Event Gvhd: Nguyễn Tấn Trần Minh KhangTa có thể tạo một delegate cho mỗi thao tác (hiệu ứng) và đẩy chúng vào một túichứa có thứ tự, như một mảng chẳng hạn, theo đúng trình tự nó sẽ được thực thi.Khi tất cả các delegate được tạo và thêm vào túi chứa, ta chỉ đơn giản duyệt suốtmảng, gọi các delegate khi tới lượt.Ta bắt đầu tạo lớp Image để đại diện cho một bức ảnh sẽ được xử lý bởiImageProcessor: public class Image { public Image( ) { Console.WriteLine(An image created); } }Lớp ImageProcessor khai báo một delegate không tham số và trả về kiểuvoid public delegate void DoEffect( );Sau đó khai báo một số phương thức để thao tác ảnh có nguyên mẫu hàm nhưdelegate đã khai báo ở trên. public static void Blur( ) { Console.WriteLine(Blurring image); } public static void Filter( ) { Console.WriteLine(Filtering image); } public static void Sharpen( ) { Console.WriteLine(Sharpening image); } public static void Rotate( ) { Console.WriteLine(Rotating image); }Lớp ImageProccessor cần một mảng để giữ các delegate người dùng chọn;một biến để giữ số lượng hiệu ứng muốn xử lý và hiển nhiên một bức ảnh image DoEffect[] arrayOfEffects; Image image; int numEffectsRegistered = 0;ImageProccessor cũng cần một phương thức để thêm delegate vào mảng public void AddToEffects(DoEffect theEffect) { if (numEffectsRegistered >= 10) { throw new Exception(Too many members in array); } arrayOfEffects[numEffectsRegistered++] = theEffect; } 96Delegate và Event Gvhd: Nguyễn Tấn Trần Minh KhangMột phương thức để gọi thực thi các ...
Tìm kiếm theo từ khóa liên quan:
Tìm hiểu ngôn ngữ C# C# và .Net Framework lập trình c# ngôn ngữ C# tài liệu c#Tài liệu liên quan:
-
161 trang 131 1 0
-
33 trang 70 0 0
-
Giáo trình Kỹ thuật lập trình nâng cao (Ngành: Tin học ứng dụng) - CĐ Kinh tế Kỹ thuật TP.HCM
119 trang 66 0 0 -
1 trang 45 0 0
-
thủ thuật windows XP hay nhất phần 2
14 trang 43 0 0 -
Các Chủ Đề Tiến Bộ Trong C# part
8 trang 41 0 0 -
Bài giảng Lập trình Windows Form với C#: Chương 1 - Lê Thị Ngọc Hạnh
56 trang 35 0 0 -
Tự học C# bằng hình ảnh cho người mới bắt đầu: Phần 1
88 trang 32 0 0 -
Các Chủ Đề Tiến Bộ Trong C# part 1
19 trang 29 0 0 -
hướng dẫn sử dụng Rhino Ceros phần 6
12 trang 29 0 0