Pergunta

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.

Foi útil?

Solução

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 um determinado tipo de objeto que define, o delegado apresenta a assinatura do método para o tipo de método que define.

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

Um ótimo exemplo de aplicação de um delegado no mundo real é o Predicado.No exemplo do link, você notará que Matriz.Encontrar pega o array para pesquisar e depois um predicado para lidar com os critérios do que encontrar.Neste caso ele passa um método ProductGT10 que corresponde à assinatura do Predicate.

Outras dicas

Como afirmado 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 participar do funeral pessoalmente.Em vez disso, ele envia um delegado.Muitas vezes 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 até a primeira-dama.Ele não quer "amarrar" seu delegado. autoridade para uma única pessoa;ele poderia delegar essa responsabilidade a qualquer pessoa que seja capaz de executar o protocolo internacional correto.

O Presidente define antecipadamente qual responsabilidade será delegada (participe do funeral), quais parâmetros serão aprovados (condolências, palavras gentis) e que valor ele espera voltar (boa vontade).Ele então atribui uma pessoa em particular a essa responsabilidade delegada em "tempo de execução" à medida que o curso de sua presidência avança.

No cenário de programação: Muitas vezes, você 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, convém solicitar 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 para um objeto específico, você conectará o botão a um delegado e resolverá que ele delegue a um método específico quando o programa for executado.

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 para pesquisar ou remover uma lista:

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

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

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á incluído na classe EventHandler.

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 UI preferido da Apple para programação no Mac OS X e é codificado em Objective C.Ele foi projetado para que cada componente da UI seja estendido por meio de delegação, em vez de subclasse ou outros meios.

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

Eu tive 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.Ele tinha um objeto de conexão passado como argumento, mas precisava saber se deveria usar dbi.dbiDate ou datetime para representar horários.

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

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

Minha solução foi agrupar os objetos de conexão retornados por odbc.odbc(...) e pyodbc.pyodbc(...) por uma classe delegada, 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.

Eu tive a mesma pergunta que você e entrei neste site para obter uma resposta.

Aparentemente, não entendi melhor, embora tenha folheado os exemplos deste tópico.

Encontrei 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 o Forms é muito mais complicado para passar valores do que sites ASP.NET com POST/GET (QueryString).

Basicamente você define um delegado que leva "Caixa de texto texto" 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:Defina o delegado, instancie a nova classe Form2, atribua a função funData() ao delegado, passe seu textBox para o delegado.Mostre o formulário.

//Formulário2

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 para os delegados :) ..

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top