Делегаты в C#
Делегат в C# позволяет передавать методы одного класса объектам других классов, которые могут вызывать эти методы.
Вы можете передать метод m в классе A, завернутый в делегат, в класс B, и класс B сможет вызывать метод m в классе A.
Использование делегата включает четыре шага.
- Объявите объект делегата с сигнатурой, точно соответствующей сигнатуре метода, который вы пытаетесь инкапсулировать. (имеется ввиду одинаковые параметры, стоящие в скобочках - как по типу, так и по количеству).
- Определите все методы, сигнатуры которых совпадают с сигнатурой объекта делегата, который вы определили на шаге 1.
- Создайте объект делегата и подключите методы, которые вы хотите инкапсулировать.
- Вызывайте инкапсулированные методы через объект делегата.
В следующем коде C# показаны описанные выше четыре шага, реализованные с использованием одного делегата и четырех классов. Ваша реализация будет варьироваться в зависимости от дизайна ваших классов.
using System;
//Step 1. Объявить делегат с сигнатурой инкапсулированного метода
public delegate void MyDelegate(string input);
//Step 2. Определите методы, соответствующие сигнатуре объявления делегата
class MyClass1
{ public void delegateMethod1(string input) { Console.WriteLine("This is delegateMethod1 and the input to the method is {0}", input); } public void delegateMethod2(string input) { Console.WriteLine("This is delegateMethod2 and the input to the method is {0}", input); } } //Step 3. Create delegate object and plug in the methods class MyClass2 { public MyDelegate createDelegate() { MyClass1 c2 = new MyClass1(); MyDelegate d1 = new MyDelegate(c2.delegateMethod1); MyDelegate d2 = new MyDelegate(c2.delegateMethod2); MyDelegate d3 = d1 + d2; return d3; } } //Step 4. Call the encapsulated methods through the delegate class MyClass3 { public void callDelegate(MyDelegate d, string input) { d(input); } } class Driver { static void Main(string[] args) { MyClass2 c2 = new MyClass2(); MyDelegate d = c2.createDelegate(); MyClass3 c3 = new MyClass3(); c3.callDelegate(d, "Calling the delegate"); } }
Комментариев нет:
Отправить комментарий