Вопрос

Каковы некоторые реальные места в мире, которые требуют делегатов?Мне любопытно, какие существуют ситуации или паттерны, в которых этот метод является наилучшим решением.Код не требуется.

Это было полезно?

Решение

Делегат - это именованный тип, который определяет определенный тип метода.Точно так же, как в определении класса указаны все члены для данного типа объекта, который он определяет, делегат указывает сигнатуру метода для типа метода, который он определяет.

Основываясь на этом утверждении, делегат является указателем на функцию и определяет, как выглядит эта функция.

Отличным примером применения делегата в реальном мире является Предикат.В примере по ссылке вы заметите, что Массив.Найти принимает массив для поиска, а затем предикат для обработки критериев того, что нужно найти.В этом случае он передает метод ProductGT10, который соответствует сигнатуре предиката.

Другие советы

Как указано в "Изучение C # 3.0:Освоите основы C # 3.0"

Общий сценарий: Когда умирает глава государства, у президента Соединенных Штатов обычно нет времени лично присутствовать на похоронах .Вместо этого он отправляет делегата.Часто этим делегатом является вице-президент, но иногда вице-президент недоступен, и Президент должен послать кого-то другого, например государственного секретаря или даже первую леди.Он не хочет “жестко закреплять” делегированные ему полномочия за одним человеком;он может делегировать эту обязанность тот, кто способен выполнить необходимую международный протокол.

Президент заранее определяет, какая ответственность будет делегирована (присутствовать на похоронах), какие параметры будут переданы (соболезнования, добрые слова) и какую ценность он надеется получить в ответ (добрая воля).Затем он назначает конкретного человека для выполнения этой делегированной ответственности на “время выполнения” по мере продвижения его президентства.

В сценарии программирования: Вы часто сталкиваетесь с ситуациями, когда вам нужно выполнить определенное действие, но вы не знаете заранее, какой метод или даже какой объект вы захотите вызвать для его выполнения.

Например: Кнопка может не знать, какой объект или объекты нуждаются в уведомлении.Вместо того, чтобы привязывать кнопку к определенному объекту, вы подключаете кнопку к делегату, а затем разрешаете это делегирование определенному методу при выполнении программы.

Одним из распространенных способов использования делегатов для общих списков является использование делегатов действия (или его анонимного эквивалента) для создания однострочной операции foreach:

myList.Foreach( i => i.DoSomething());

Я также нахожу делегат предиката весьма полезным при поиске или сокращении списка:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

Я знаю, вы сказали, что код не требуется, но я считаю, что проще выразить его полезность с помощью кода.:)

Привязка событий к обработчикам событий обычно является вашим первым знакомством с делегатами...Возможно, вы даже не знаете, что используете их, потому что делегат заключен в класс EventHandler.

Если вам интересно посмотреть, как шаблон делегирования используется в реальном коде, не смотрите дальше Cocoa в Mac OS X.Cocoa - это предпочтительный пользовательский инструментарий Apple для программирования под Mac OS X, закодированный в Objective C.Он разработан таким образом, что каждый компонент пользовательского интерфейса предназначен для расширения с помощью делегирования, а не подклассов или других средств.

Для получения дополнительной информации я рекомендую ознакомиться с тем, что Apple может сказать о делегатах здесь.

У меня был проект, в котором использовался win32 Python.

По разным причинам некоторые модули использовались odbc.py для доступа к БД, а другие модули - pyodbc.py.

Возникла проблема, когда функция должна была использоваться обоими типами модулей.Ему был передан объект connection в качестве аргумента, но затем он должен был знать, использовать ли dbi.dbiDate или datetime для представления времени.

Это было связано с тем, что odbc.py ожидаемые в качестве значений в операторах SQL даты указаны как dbi.dbiDate, тогда как pyodbc.py ожидаемые значения datetime.

Еще одной сложностью было то, что объекты connection, созданные odbc.py и pyodbc.py, не позволяли задавать дополнительные поля.

Мое решение состояло в том, чтобы обернуть объекты connection, возвращаемые odbc.odbc(...) и pyodbc.pyodbc(...), классом делегата, который содержит желаемую функцию представления времени в качестве значения дополнительного поля и который делегирует все другие запросы полей исходному объекту connection.

У меня был тот же вопрос, что и у вас, и я зашел на этот сайт за ответом.

По-видимому, я не понял этого лучше, хотя и просмотрел примеры в этой теме.

Теперь, когда я прочитал, я нашел отличное применение делегатам: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Это может показаться более очевидным для новых пользователей, потому что Forms намного сложнее передавать значения, чем ASP.NET веб-сайты с POST / GET (QueryString) ..

По сути, вы определяете делегат, который принимает "Текстовое поле текст" в качестве параметров.

// Форма 1

// Class Property Definition
public delegate void delPassData(TextBox text);


// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
     Form2 frm= new Form2();
     delPassData del=new delPassData(frm.funData);
     del(this.textBox1);
     frm.Show();
}

// КРАТКОЕ СОДЕРЖАНИЕ:Определите делегат, создайте экземпляр нового класса Form2, назначьте функцию funData() для делегирования, передайте свое текстовое поле делегату.Покажите форму.

// Форма 2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// КРАТКОЕ СОДЕРЖАНИЕ:Просто возьмите TextBox txtForm1 в качестве параметров (как определено в вашем делегате) и назначьте текст метки тексту TextBox.

Я надеюсь, что это прояснит некоторые аспекты использования делегатов :)..

Быстрый поиск в Google выдал следующее http://en.wikipedia.org/wiki/Delegation_pattern .По сути, всякий раз, когда вы используете объект, который пересылает свои вызовы другому объекту, вы делегируете его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top