Страница: 1 |
Страница: 1 |
Вопрос: Delegate
Добавлено: 22.06.04 00:04
Автор вопроса: Logot | ICQ: 305396405
Хлопцы! Вот грызу этот камень под названием 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
Автор ответа:
Logot
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
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #4
Добавлено: 26.06.04 13:12
Я не знаю VB.NET и то понял. Просто у тебя ещё уровень не тот. Конечно Павел мог бы объяснить и попонятнее, но для этого тоже способности нужны.
Номер ответа: 5
Автор ответа:
Logot
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
Автор ответа:
Logot
ICQ: 305396405
Вопросов: 9
Ответов: 28
Профиль | | #7
Добавлено: 04.07.04 01:09
Спасибо, Павел, до меня начало понемногу доходить.
Номер ответа: 8
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #8
Добавлено: 04.07.04 08:04
Я сейчас перевожу статью из буржуйского журнала про интерфейсы и
делегаты в .Net для обратной связи с клиентами... Скоро закончу
Номер ответа: 9
Автор ответа:
Logot
ICQ: 305396405
Вопросов: 9
Ответов: 28
Профиль | | #9
Добавлено: 06.07.04 00:32
Павел, очень бы хотелось почитать. Когда закончиш, скажешь где найти.