Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Delegate Добавлено: 22.06.04 00:04  

Автор вопроса:  Logot | ICQ: 305396405 
Хлопцы! Вот грызу этот камень под названием VB.Net и не могу понять, что такое Делегаты.
Не понятно как они используются и как они работают, знаю, что они как-то связаны с событиями, но как конкретно это всё работает не пойму. И вообще какие функции они выполняют и для чего они предназначены. Может кто-то объяснит или кинет ссылку, где ясно и подробно рассматривается этот вопрос, а то в книжках как-то мутно и поверхностно это всё описывается, что складывается впечатление, что это специально так описано, чтобы читатель ничего не понял из того что там написано.
Заранее спасибо.

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 26.06.04 09:56
Жаль..
Советую почитать про это в книжке "C# и платформа .NET". Довольно
неплохая книжка, кстати.

Ответить

Номер ответа: 4
Автор ответа:
 @CyRax PTR



ICQ: 204447456 

Вопросов: 28
Ответов: 664
 Web-сайт: basicproduction.nm.ru/
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #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-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 04.07.04 08:04
Я сейчас перевожу статью из буржуйского журнала про интерфейсы и
делегаты в .Net для обратной связи с клиентами... Скоро закончу :)

Ответить

Номер ответа: 9
Автор ответа:
 Logot



ICQ: 305396405 

Вопросов: 9
Ответов: 28
 Профиль | | #9 Добавлено: 06.07.04 00:32
Павел, очень бы хотелось почитать. Когда закончиш, скажешь где найти.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам