Onde eu uso delegados? [fechadas]

109

Quais são alguns lugares do mundo real que exigem delegados? Estou curioso para saber quais situações ou padrões estão presentes onde este método é a melhor solução. Nenhum código necessário.

Slipsec
fonte

Respostas:

33

Um delegado é um tipo nomeado que define um tipo específico de método. Assim como uma definição de classe apresenta todos os membros para o tipo de objeto que define, o delegado define a assinatura do método para o tipo de método que define.

Com base nessa declaração, um delegado é um ponteiro de função e define a aparência dessa função.

Um ótimo exemplo para uma aplicação do mundo real de um delegado é o Predicado . No exemplo do link, você notará que Array.Find pega a matriz para pesquisar e, em seguida, um predicado para lidar com os critérios do que encontrar. Nesse caso, ele passa um método ProductGT10 que corresponde à assinatura do Predicado.

Dale Ragan
fonte
154

Conforme declarado em "Aprendendo C # 3.0: Domine os fundamentos do C # 3.0"

Cenário geral: quando um chefe de estado morre, o presidente dos Estados Unidos normalmente não tem tempo para comparecer ao funeral pessoalmente. Em vez disso, ele envia um delegado. Freqüentemente, esse delegado é o vice-presidente, mas às vezes o vice-presidente não está disponível e o presidente deve enviar outra pessoa, como o secretário de Estado ou mesmo a primeira-dama. Ele não quer “conectar” sua autoridade delegada a uma única pessoa; ele pode delegar essa responsabilidade a qualquer pessoa que seja capaz de executar o protocolo internacional correto.

O Presidente define com antecedência quais responsabilidades serão delegadas (comparecimento ao funeral), quais parâmetros serão passados ​​(condolências, palavras gentis) e que valor espera receber (boa vontade). Ele então designa uma pessoa específica para essa responsabilidade delegada em “tempo de execução”, conforme o curso de sua presidência progride.

Cenário de programação: Você frequentemente se depara com situações em que precisa executar uma ação específica, mas não sabe com antecedência qual método, ou mesmo qual objeto, deseja chamar para executá-lo.

Por exemplo: Um botão pode não saber qual objeto ou objetos precisam ser notificados. Em vez de conectar o botão a um objeto específico, você conectará o botão a um delegado e, em seguida, resolverá esse delegado a um método específico quando o programa for executado.

Atish Dipongkor - MVP
fonte
1
Por que não usar funções anônimas / lambdas então?
Pacerier
5
@Pacerier Esta é uma resposta tardia e você pode ter descoberto a resposta, mas para o bem de outros leitores que descobrirem isso: uma função anônima é um tipo de delegado.
Anthony
10
@ Anthony + Pacerier: Um método anônimo NÃO é um delegado. Um método anônimo é um pedaço de código. Um delegado é um ponteiro que aponta para aquele trecho de código. Você não pode ter um método anônimo sem um delegado apontando para ele, caso contrário, ele nunca seria chamado. Um lambda é um operador, usado para construir expressões lambda. Expressões lambda geralmente resultam em métodos anônimos que serão apontados por ... um delegado.
Martin Mulder,
Eu sou bobo, mas eu apenas criaria uma declaração If ElseIf se não soubesse o uso quando o botão fosse pressionado. Eu disse que sou boba.
JustJohn
Método anônimo @Pacerier introduzido em C # 2.0 e Lambda introduzido em C # 3.0 se Lambda fosse introduzido primeiro, nunca haveria métodos anônimos e até mesmo delegados!
AminM de
18

Um uso comum de delegados para listas genéricas é por meio de delegados de ação (ou seu equivalente anônimo) para criar uma operação foreach de uma linha:

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

Também acho o delegado Predicate bastante útil na pesquisa ou poda de uma lista:

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

Eu sei que você disse que nenhum código é necessário, mas acho mais fácil expressar sua utilidade por meio de código. :)

Jon Limjap
fonte
13

Vincular eventos a manipuladores de eventos geralmente é sua primeira introdução aos delegados ... Você pode nem saber que os estava usando, porque o delegado está envolvido na classe EventHandler.

FlySwat
fonte
5

Se você estiver interessado em ver como o padrão Delegate é usado no código do mundo real, não procure além do Cocoa no Mac OS X. Cocoa é o kit de ferramentas de IU preferido da Apple para programação no Mac OS X e é codificado no Objective C. projetado de forma que cada componente de UI seja estendido por meio de delegação, em vez de subclassificação ou outros meios.

Para obter mais informações, recomendo verificar o que a Apple tem a dizer sobre os delegados aqui .

enchente
fonte
5

Eu tinha um projeto que usava win32 Python.

Por vários motivos, alguns módulos usaram odbc.py para acessar o banco de dados e outros módulos - pyodbc.py.

Ocorreu um problema quando uma função precisava ser usada por ambos os tipos de módulos. Um objeto de conexão foi passado para ele como um argumento, mas então ele teve que saber se deveria usar dbi.dbiDate ou datetime para representar tempos.

Isso ocorria porque odbc.py esperava, como valores em instruções SQL, datas como dbi.dbiDate, enquanto pyodbc.py esperava valores de data e hora.

Uma outra complicação era que os objetos de conexão criados por odbc.py e pyodbc.py não permitiam definir campos adicionais.

Minha solução foi envolver os objetos de conexão retornados por odbc.odbc (...) e pyodbc.pyodbc (...) por uma classe de delegado, que contém a função de representação de tempo desejada como o valor de um campo extra e que delega todas as outras solicitações de campo para o objeto de conexão original.

Omer Zak
fonte
5

Eu tinha a mesma pergunta que você e fui a este site para obter uma resposta.

Aparentemente, eu não entendi melhor, embora tenha lido os exemplos neste tópico.

Descobri um ótimo uso para delegados agora que li: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Isso pode parecer mais óbvio para novos usuários porque Forms é muito mais complicado de passar valores do que sites ASP.NET com POST / GET (QueryString).

Basicamente, você define um delegado que usa "TextBox text " como parâmetros.

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

// RESUMO: Definir delegado, instanciar nova classe Form2, atribuir função funData () para delegar, passar seu textBox para o delegado. Mostre o formulário.

// Form2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// RESUMO: Simplesmente pegue TextBox txtForm1 como parâmetros (conforme definido em seu delegado) e atribua o texto do rótulo ao texto do textBox.

Espero que isso esclareça alguma utilidade em delegados :) ..

dezza
fonte
O método de classe Form2 precisa ser denominado funData (em vez de passData) ou a atribuição de função Form1 precisa ser nomeada frm.passData (em vez de frm.funData).
Ethan
1

Uma rápida pesquisa no Google encontrou este http://en.wikipedia.org/wiki/Delegation_pattern . Basicamente, sempre que você usa um objeto que encaminha suas chamadas para outro objeto, você está delegando.

martinatime
fonte