Страница: 1 |
Вопрос: Delegate | Добавлено: 22.06.04 00:04 |
Автор вопроса: ![]() |
Хлопцы! Вот грызу этот камень под названием VB.Net и не могу понять, что такое Делегаты. Не понятно как они используются и как они работают, знаю, что они как-то связаны с событиями, но как конкретно это всё работает не пойму. И вообще какие функции они выполняют и для чего они предназначены. Может кто-то объяснит или кинет ссылку, где ясно и подробно рассматривается этот вопрос, а то в книжках как-то мутно и поверхностно это всё описывается, что складывается впечатление, что это специально так описано, чтобы читатель ничего не понял из того что там написано. Заранее спасибо. |
Ответы | Всего ответов: 9 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 22.06.04 09:18 |
Делегат - это ссылка на функцию обратного вызова.. Зачем это может быть нужно? Например, подчинённый объект хочет сообщить какую-нть инфу родителю. Как это сделать? Можно через интерфейсы.. А можно через делегат: 'Код подчинённого класса Public Class Class2 'Сам делегат Public Delegate Sub MyDelegate (ByVal Argument As String) 'Ссылка на экземпляр Public DelHandler As MyDelegate Public Sub DoSomeWork () ... 'Сообщаем родителю инфу DelHandler.Invoke (New String() {"Привет от Class2!"}) ... End Sub End Class 'Код родительского класса Public Class Class1 Public Sub Start () 'Создаём экземпляр Class2 Dim c2 As New Class2 'Устанавливаем ссылку на делегат c2.DelHandler = New MyDelegate (AddressOf MyHadler) 'Запускаем некую процедуру c2.DoSomeWork End Sub Public Sub MyHandler (ByVal Argument As String) Console.WriteLine (Argument) End Sub End Class При запуске процедуры Start класса Class1 будет создан экземпляр Class2, установлена ссылка на делегат. В методе DoSomeWork в Class2 мы вызываем этот делегат с помощью метода Invoke, в результате чего вызывается процедура MyHandler класса Class1, потому что она была указана при вызове консруктора делегата MyDelegate. События - это своего рода надстройка над делегатами... |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #2 | Добавлено: 25.06.04 23:13 |
Спасибо Павел за ответ, но меня это не просветило.
Буду искать дополнительную литературу. |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 26.06.04 09:56 |
Жаль.. Советую почитать про это в книжке "C# и платформа .NET". Довольно неплохая книжка, кстати. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 204447456 Вопросов: 28 Ответов: 664 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 26.06.04 13:12 |
Я не знаю VB.NET и то понял. Просто у тебя ещё уровень не тот. Конечно Павел мог бы объяснить и попонятнее, но для этого тоже способности нужны. |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #5 | Добавлено: 26.06.04 22:51 |
Ребята, я знаю, что у меня уровень не тот, но чтобы повысить этот уровень, хоть на ступеньку, я пытаюсь это всё изучить. |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 03.07.04 17:26 |
Из форума GotDotNet.Ru: Делегат - это класс, представляющий описание типа какой-либо функции. Он используется когда надо определить указатель на функцию (на самом деле делегат - это и есть описание типа для указателя на функцию). Потому когда объявляете переменную с типом - делегатом, у нее нет реализации - зато потом можно ей присвоить "адрес" уже написанной функции ("адрес" в кавычках, поскольку адрес функции в C# отсутствует как понятие), и даже не одной. Затем можно с помощью этой переменной вызывать функцию, адрес которой был присвоен. Сам же делегат определяется так же, как и заголовок функции, без тела // этот код вне класса delegate void MyDelegate(int i); // этот код в классе event MyDelegate MyEvent; void MyFunc(int i) { MessageBox.Show( i.ToString() ); } // А это в функции класса, как правило в ф-ии инициализации MyEvent += new MyDelegate(MyFunc); // это как раз присваивание переменной адреса функции MyFunc, теперь при событии MyEvent будет вызвана MyFunc Кстати, в интерфейсах вообще не может быть реализаций функций, только описания. |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #7 | Добавлено: 04.07.04 01:09 |
Спасибо, Павел, до меня начало понемногу доходить. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 04.07.04 08:04 |
Я сейчас перевожу статью из буржуйского журнала про интерфейсы и делегаты в .Net для обратной связи с клиентами... Скоро закончу ![]() |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 305396405 Вопросов: 9 Ответов: 28 |
Профиль | Цитата | #9 | Добавлено: 06.07.04 00:32 |
Павел, очень бы хотелось почитать. Когда закончиш, скажешь где найти. |
Страница: 1 |
|