Total de visualizações de página

quarta-feira, 7 de março de 2012

O que é Delegate?

Generalização:
A generalização tem como função agrupar características comuns para objetos dentro de um mesmo contexto.
Veja o diagrama de classe, superclass é a classe Pessoa.



Podemos perceber que no topo temos a Pessoa(superclass), que pode ser um Cliente ou Usuário. Por sua vez esse usuário poderá ser um Administrador, assim tendo funções especiais como excluir ou inserir novos usuários.


Definição de Delegate:
O delegate são ponteiros para funções(métodos)

O que é um ponteiro?:
Ponteiro é um valor atribuído em memória que aponta para outro valor em memórias através de seu endereço.

Quando temos necessidade de utilizarmos métodos, e não sabemos qual método chamar, pois dependemos de algumas condições, podemos deixar o nosso código mais bonito usando um delegate.
dição.

Veja exemplo:
Abaixo temos um exemplo de uma aplicação Console em C#.
static class Program
02
{
03
//declara a assinatura do delegate.
04
//os métodos deverão ter a mesma assinatura
05
//para que possam ser utilizados pelo delegate
06
delegate int Calular(int a, int b);
07
08
static void Main()
09
{
10
11
//declara a variável do tipo delegate
12
Calular calc;
13
14
//uma condição qualquer
15
if (DateTime.Now.Second % 2 == 0)
16
//define o método dividir para ser usado no delegate
17
calc = new Calular(Dividir);
18
else
19
//define o método somar para ser usado no delegate
20
calc = new Calular(Somar);
21
22
//chama o método
23
Console.WriteLine(calc.Invoke(DateTime.Now.Millisecond,
24
DateTime.Now.Second));
25
26
Console.ReadKey();
27
}
28
29
//declara o método somar
30
private static int Somar(int a, int b)
31
{
32
return a + b;
33
}
34
35
private static int Dividir(int x, int y)
36
{
37
return x / y;
38
}
39
}



Eventos:
São mensagens trocadas pelos sistemas, métodos e objeto para informar um acontecimento, uma ação que se inicia, que termina dentro da aplicação.
Podemos citar o método Andar() em Pessoa, assim podemos dizer que a Pessoa está Andando até que pare de andar, ou podemos dizer que a pessoa vai parar de Andar antes de ela parar de Andar.
Assim o objeto que chama pode executar alguma ação antes da Pessoa realmente para de Andar.

Exemplo de eventos em C#:Para usar eventos em C# temos que fazer uso de delegates como foi visto acima o delegate e um ponteiro para uma função (método), e eventos usam delegates para apontar a qual método o mesmo deverá chamar.
Declaração de Pessoa
public class Pessoa
02
{
03
//declaração da assinatura do delegate
04
//que irá tratar os eventos
05
public delegate void AndarHandler();
06
07
//este evento irá mostrar que podemos esperar
08
//retorno do objeto que chamou
09
//o parâmetro pararAndar irá retornar true or false
10
//dependendo do caso se for ou não para parar de andar
11
public delegate void AndandoHandler(out bool pararAndar);
12
13
//declaração dos eventos
14
public event AndarHandler AntesAndar;
15
public event AndarHandler AntesPararAndar;
16
17
//repare aqui que iremos usar o segundo delegate
18
public event AndandoHandler Andando;
19
20
//declaração do método andar
21
public void Andar()
22
{
23
//aqui iremos chamar o evento AntesAndar e avisar
24
//o objeto chamante que iremos começar a Andar.
25
AntesAndar();
26
27
DateTime pararAs = DateTime.Now.AddSeconds(30);
28
29
//aqui iremos andar por 30 segundos
30
while (pararAs > DateTime.Now)
31
{
32
bool pararAgora = false;
33
//aqui iremos notificar que a
34
//pessoa continua Andando
35
Andando(out pararAgora);
36
37
if (pararAgora)
38
{
39
//antes de parar, notificar que vou parar
40
AntesPararAndar();
41
break;
42
}
43
44
//aqui apenas iremos parar por um segundo.
45
//não se preocupem com esta linha
46
System.Threading.Thread.Sleep(1000);
47
}
48
}
49
}
Declaração do objeto para testes.
É uma aplicação do tipo Console.

01
static void Main()
02
{
03
//cria uma pessoa
04
Pessoa marcelo = new Pessoa();
05
06
//define os métodos que irão tratar os nossos eventos
07
marcelo.Andando +=
08
new Pessoa.AndandoHandler(marcelo_Andando);
09
marcelo.AntesAndar +=
10
new Pessoa.AndarHandler(marcelo_AntesAndar);
11
marcelo.AntesPararAndar +=
12
new Pessoa.AndarHandler(marcelo_AntesPararAndar);
13
14
//chamar o método para que marcelo possa Andar
15
marcelo.Andar();
16
17
Console.WriteLine("Marcelo parou de andar.");
18
19
Console.ReadKey();
20
21
}
22
23
static void marcelo_AntesPararAndar()
24
{
25
Console.WriteLine("Marcelo irá parar de andar.");
26
}
27
28
static void marcelo_AntesAndar()
29
{
30
Console.WriteLine("Marcelo irá começar a andar.");
31
}
32
33
static void marcelo_Andando(out bool pararAndar)
34
{
35
pararAndar = false;
36
//a pessoa marcelo só vai parar se a condição for verdadeira
37
if (DateTime.Now.Second % 7 == 0)
38
pararAndar = true;
39
40
Console.WriteLine("Marcelo está andando.");
41
}


Um comentário:

  1. Na linha 6 da primeira listagem o nome do identificador não deveria ser "Calcular" em vez de "Calular" ??? (bem, cada um nomeia seus identificadores da forma que quiser). Seu post ficaria mais completo se abordasse aplicações visuais e o emprego de 'delegates' com eventos de componentes gráficos.

    ResponderExcluir