Відповіді:
Делегат - це названий тип, який визначає певний тип методу. Так само, як визначення класу викладає всіх членів для даного виду об'єкта, який він визначає, делегат викладає підпис методу для типу методу, який він визначає.
На основі цього твердження делегат - це вказівник функції, який визначає, як виглядає ця функція.
Прекрасним прикладом для застосування делегата в реальному світі є предикат . На прикладі посилання ви помітите, що Array.Find бере масив для пошуку, а потім присудок для обробки критеріїв, що потрібно знайти. У цьому випадку він передає метод ProductGT10, який відповідає підпису Predicate.
Як зазначено у "Навчанні C # 3.0: оволодіння основами C # 3.0"
Загальний сценарій: Коли глава держави помирає, президент США, як правило, не встигає особисто відвідувати похорон. Натомість він відправляє делегата. Часто цей делегат є віце-президентом, але іноді ВП є недоступним, і Президент повинен надіслати когось іншого, наприклад Державного секретаря чи навіть Першу леді. Він не хоче "переводити" свої делеговані повноваження на одну особу; він може делегувати цю відповідальність тому, хто може виконати правильний міжнародний протокол.
Президент заздалегідь визначає, яка відповідальність буде делегована (відвідуйте похорон), які параметри будуть передані (співчуття, добрі слова) та яку цінність він сподівається повернути (добра воля). Потім він привласнює конкретну особу до цієї делегованої відповідальності під час "виконання" в міру просування курсу його президентства.
Сценарій програмування: Ви часто стикаєтеся з ситуаціями, коли вам потрібно виконати певну дію, але ви не знаєте заздалегідь, який метод чи навіть який об’єкт, вам потрібно буде закликати його виконати.
Наприклад: кнопка може не знати, про який об’єкт або об’єкти потрібно повідомити. Замість того, щоб підключити кнопку до певного об'єкта, ви підключите кнопку до делегата, а потім вирішите цей делегат до певного методу при виконанні програми.
Одне розповсюдження делегатів для загальних списків - це через делегатів Action (або його анонімний еквівалент) для створення однолінійної операції foreach:
myList.Foreach( i => i.DoSomething());
Я також вважаю делегата Predicate досить корисним у пошуку чи обрізанні списку:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
Я знаю, ви сказали, що не потрібен код, але мені простіше виразити його корисність за допомогою коду. :)
Якщо вам цікаво побачити, як використовується шаблон «Делегат» у реальному коді, не дивіться далі, ніж Какао на Mac OS X. Какао - це вподобаний інструментарій інтерфейсу Apple для програмування під Mac OS X і кодується у «Цілі C.» розроблений таким чином, що кожен компонент інтерфейсу призначений для розширення шляхом делегування, а не підкласифікації чи інших засобів.
Для отримання додаткової інформації я рекомендую перевірити, що Apple може сказати про делегатів тут .
У мене був проект, який використовував Win32 Python.
Через різні причини деякі модулі використовували odbc.py для доступу до БД, а інші модулі - pyodbc.py.
Виникла проблема, коли функцію потрібно було використовувати для обох типів модулів. Він мав об'єкт з'єднання, переданий йому в якості аргументу, але тоді він повинен знати, чи використовувати dbi.dbiDate або datetime для подання часу.
Це сталося тому, що очікуваний odbc.py, як значення в операторах SQL, датується як dbi.dbiDate, тоді як pyodbc.py очікувані значення дати.
Ще одним ускладненням було те, що об'єкти з'єднання, створені odbc.py та pyodbc.py, не дозволяють встановлювати додаткові поля.
Моє рішення полягало в тому, щоб обернути об'єкти з'єднання, повернені odbc.odbc (...) та pyodbc.pyodbc (...) класом делегата, який містить бажану функцію представлення часу як значення додаткового поля та делегує всі інші запити поля до оригінального об'єкта з'єднання.
У мене було те саме питання, що і у вас, і я зайшов на цей сайт, щоб відповісти.
Мабуть, я не зрозумів це краще, хоча я проглянув приклади цієї теми.
Тепер я прочитав: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx.
Це може здатися більш очевидним для нових користувачів, оскільки Форми набагато складніше передавати значення, ніж веб-сайти ASP.NET з POST / GET (QueryString) ..
В основному ви визначаєте делегата, який приймає "TextBox текст " як параметри.
// Форма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 () для делегації, передайте ваш textBox делегату. Покажіть форму.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// РЕЗЮМЕ: Просто візьміть TextBox txtForm1 як параметри (як визначено у вашому делегаті) та призначте текст мітки текстові textBox.
Я сподіваюся, що це прояснює деяке використання делегатів :) ..
Швидкий пошук у Google придумав цей http://en.wikipedia.org/wiki/Delegation_pattern . По суті, будь-коли, коли ви використовуєте об'єкт, який пересилає його, викликає інший об'єкт, тоді ви делегуєте.