Gdzie korzystać z delegatów? [zamknięte]

Jakie są realne miejsca, które wzywają delegatów? Jestem ciekaw jakie są sytuacje lub Schematy, w których ta metoda jest najlepszym rozwiązaniem. Kod nie jest wymagany.

Author: Will, 2008-08-28

8 answers

Delegat jest typem nazwanym, który definiuje określony rodzaj metody. Podobnie jak definicja klasy określa wszystkie elementy składowe dla danego rodzaju obiektu, który definiuje, delegat określa sygnaturę metody dla rodzaju metody, którą definiuje.

Na podstawie tego stwierdzenia, delegat jest wskaźnikiem funkcji i określa, jak ta funkcja wygląda.

Doskonałym przykładem zastosowania delegata w świecie rzeczywistym jest predykat . W przykładzie z link, zauważysz, że Array.Find pobiera tablicę do wyszukiwania, a następnie predykat do obsługi kryteriów wyszukiwania. W tym przypadku przekazuje metodę ProductGT10, która odpowiada sygnaturze predykatu.

 30
Author: Dale Ragan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 03:11:35

"Nauka C# 3.0: opanuj podstawy C# 3.0"

Scenariusz ogólny: kiedy umiera głowa państwa, prezydent Stanów Zjednoczonych zazwyczaj nie ma czasu, aby wziąć udział w pogrzebie osobiście. Zamiast tego wysyła delegata. Często ten delegat jest Wiceprezesa, ale czasami wiceprezes jest niedostępny i Prezydent musi wysłać kogoś innego, np. Sekretarza Stanu lub nawet Pierwsza Dama. Nie chce "hardwire" uprawnienia do jednej osoby; może on przekazać tę odpowiedzialność do każdy, kto jest w stanie wykonać poprawny protokół Międzynarodowy.

Prezes z góry określa, jaką odpowiedzialność będzie przekazywana (uczestniczyć w pogrzebie), jakie parametry zostaną przekazane (kondolencje, miłe słowa), a jaką wartość chce odzyskać (dobra wola). On przypisuje danej osobie tę powierzoną odpowiedzialność w "runtime" jako przebieg jego prezydentura postępuje.

W scenariuszu programowania: często masz do czynienia z sytuacjami, w których musisz wykonać określoną akcję, ale nie wiesz w rozwiń metodę, a nawet obiekt, do którego chcesz się zwrócić aby go wykonać.

Na przykład: Przycisk może nie wiedzieć, który obiekt lub obiekty należy powiadomić. Zamiast okablowania przycisku do konkretnego obiektu, podłączysz przycisk do delegata, a następnie rozwiąż które delegują do określonej metody podczas wykonywania programu.

 146
Author: Atish Dipongkor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-04 00:35:59

Jednym z powszechnych zastosowań delegatów dla list generycznych jest użycie delegatów akcji (lub jej anonimowego odpowiednika) do utworzenia jednowierszowej operacji foreach:

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

Uważam również, że delegat predykatu jest bardzo przydatny w wyszukiwaniu lub przycinaniu listy:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");
Wiem, że powiedziałeś, że kod nie jest wymagany, ale łatwiej jest mi wyrazić jego przydatność za pomocą kodu. :)
 16
Author: Jon Limjap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 02:32:42

Wiązanie zdarzeń do procedur obsługi zdarzeń jest zazwyczaj pierwszym wprowadzeniem do delegatów...Możesz nawet nie wiedzieć, że ich używasz, ponieważ delegat jest zapakowany w klasę EventHandler.

 11
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 02:00:18

Jeśli chcesz zobaczyć, jak wzór delegata jest używany w kodzie rzeczywistym, nie szukaj dalej niż Cocoa na Mac OS X. Cocoa jest preferowanym przez Apple zestawem narzędzi interfejsu użytkownika do programowania w systemie Mac OS X i jest zakodowany w Objective C. został zaprojektowany tak, aby każdy komponent interfejsu był przeznaczony do rozszerzania za pomocą delegowania, a nie podklasowania lub innych środków.

Aby uzyskać więcej informacji, polecam sprawdzić, co Apple ma do powiedzenia na temat delegatów tutaj .

 4
Author: spate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 02:30:16

Miałem projekt, który używał Pythona win32.

Z różnych powodów niektóre moduły używane odbc.py aby uzyskać dostęp do DB i innych modułów - pyodbc.py.

Wystąpił problem, gdy funkcja musiała być używana przez oba rodzaje modułów. Miał obiekt connection przekazany do niego jako argument, ale potem musiał wiedzieć, czy używać dbi.dbiDate lub datetime do reprezentowania czasów.

To dlatego, że odbc.py oczekiwane, jako wartości w poleceniach SQL, daty jako dbi.dbidat a także mając na uwadze pyodbc.py oczekiwane wartości datetime.

Kolejną komplikacją było to, że obiekty łączące utworzone przez odbc.py oraz pyodbc.py nie pozwala na ustawienie dodatkowych pól.

Moim rozwiązaniem było zawinięcie obiektów połączeń zwracanych przez odbc.odbc(...) i pyodbc.pyodbc(...) przez klasę delegata, która zawiera żądaną funkcję reprezentacji czasu jako wartość dodatkowego pola i która deleguje wszystkie inne żądania pól do oryginalnego obiektu połączenia.

 4
Author: Omer Zak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 14:39:18

Miałem to samo pytanie co ty i poszedłem na tę stronę po odpowiedź.

Najwyraźniej nie rozumiałem tego lepiej, mimo że przejrzałem przykłady w tym wątku.

Znalazłem wielki pożytek dla delegatów teraz, gdy przeczytałem: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Może to wydawać się bardziej oczywiste dla nowych użytkowników, ponieważ formularze są znacznie bardziej skomplikowane w przekazywaniu wartości niż ASP.NET strony internetowe z POST/GET (QueryString) ..

Zasadniczo definiujesz delegata, który przyjmuje " TextBox tekst" jako parametry.

// Form1

// 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();
}

// SUMMARY: Definiowanie delegata, tworzenie nowej klasy Form2, przypisywanie funkcji funData() do delegata, przekazywanie w polu tekstowym do delegata. Pokaż formularz.

// Form2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

/ / SUMMARY: po prostu weź TextBox txtForm1 jako parametry (zdefiniowane w delegacie) i przypisz tekst etykiety do tekstu textBox.

I mam nadzieję, że będzie to przydatne na forum:)..

 4
Author: dezza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-10 08:42:55

Szybkie wyszukiwanie w google wyszło z tego http://en.wikipedia.org/wiki/Delegation_pattern . Zasadniczo za każdym razem, gdy używasz obiektu, który przekazuje jego połączenia do innego obiektu, delegujesz je.

 0
Author: martinatime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 02:03:27