View
242
Download
0
Category
Preview:
DESCRIPTION
Introduccion a los delegados en C# usando el paradigma orientado a objetos.
Citation preview
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 1
CAPTULO 8DELEGADOS
2
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 2
Es un nuevo tipo que hace referencia a un mtodo Es muy semejante a un apuntador de C++ Permiten pasar los mtodos como parmetros
Sintaxismodificador delegate tipo nombre(parmetros);
Modificadores: private protected public internal
DELEGADOS
Si un delegado es un tipo, entonces se puedendeclarar variables de dicho tipo.
Un delegado es una referencia a un mtodo. Una variable creada de un tipo delegado
representa a un mtodo determinado.
Un delegado
es un tipo
Para qu sirve un delegado?
Los delegados se utilizan para enviar mtodos como parmetros a otros mtodos.
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 3
public delegate bool TipoOrdenamiento(double x, double y);
Cualquier mtodo puede asignarse a un delegado. Deben coincidir
El prototipo del delegado Parmetros Tipo de dato del valor devuelto
Ejemplo de delegados
Tanto los delegados como las interfaces permiten aun diseador de clases separar las declaraciones y laimplementacin de tipos.
Cualquier objeto puede utilizar una referencia deinterfaz o un delegado sin tener conocimiento algunosobre la clase que implementa el mtodo de interfazo delegado.
Cuando utilizar delegados en lugar de interfaces
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 4
Se utilice un modelo de diseo de eventos. Se prefiere a la hora de encapsular un mtodo
esttico. El autor de las llamadas no tiene ninguna necesidad
de obtener acceso a otras propiedades, mtodos ointerfaces en el objeto que implementa el mtodo.
Se desea conseguir una composicin sencilla. Una clase puede necesitar ms de una
implementacin del mtodo.
Utilice un delegado cuando
Haya un grupo de mtodos relacionados a los que sepueda llamar.
Una clase slo necesita una implementacin delmtodo.
La clase que utiliza la interfaz desear convertir esainterfaz en otra interfaz o tipos de clase.
El mtodo que se va a implementar est vinculado altipo o identidad de la clase; por ejemplo, mtodos decomparacin.
Utilice una interfase cuando
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 5
Los delegados se declaran como cualquier otro objetoen .NET
Para asignar un delegado, no se asigna un valor,sino un mtodo.
Cmo se declara una variable de un tipo delegado?
Utilizar un delegadopara seleccionar eltipo de clculo arealizar
Ejemplo de aplicacin
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 6
Diagrama de clase en UML
class Circunferencia{
//Atributo privadoprivate double radio;
// Propiedad pblicapublic double Radio{
get{
return radio;}
set{
radio = value;if (radio < 0){
radio = 0;throw new Exception("No se
permite un valor negativo");}
}}
// Mtodo para calcular el reapublic double CalcularArea(){
return Math.PI * Math.Pow(Radio, 2);}
// Mtodo para calcular el Permetropublic double CalcularPerimetro(){
return Math.PI * Radio * 2;}
// Delegado pblicopublic delegate double Operacion();
// Mtodo que recibe como parmetro el mtodo que desea invocar (del tipo del delegado)
public double Calcular(Operacion C){
double Resultado = C();return Resultado;
}}
Codificacin de la clase
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 7
private void btnCalcular_Click(object sender, EventArgs e){
Circunferencia miCircunferencia = new Circunferencia();
try{
miCircunferencia.Radio = double.Parse(txtRadio.Text);}catch (Exception x){
MessageBox.Show(x.Message);txtRadio.Text = "";txtRadio.Focus();return;
}
if (rbtnCalcularArea.Checked)MessageBox.Show("rea = " +
miCircunferencia.Calcular(miCircunferencia.CalcularArea));else
MessageBox.Show("Permetro = " + miCircunferencia.Calcular(miCircunferencia.CalcularPerimetro));}
Utilizacin del delegado para invocar al mtodo
Hasta ahora, se han revisado los delegados generadosa partir de mtodos con un nombre
Son estrategias para crear objetos de un delegado einmediatamente definir el bloque de sentencias decdigo que ejecutar cuando se invoque
Mtodos annimos
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 8
Pasa directamente un bloque de sentencias de cdigocomo parmetro a un delegado.
Reduce con esto la sobrecarga de codificacin almomento de crear objetos de delegados
Evita definir un mtodo independiente.
Para qu sirve un mtodo annimo?
El mtodo annimo no tiene nombre, entonces cmo puede invocarse?
La respuesta es a travs de delegados.
Cmo se invoca un mtodo annimo?
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 9
Es una funcin (devuelve un valor) annima que se utiliza para crear delegados
Permite implementar funciones que se pueden enviar como parmetro o devolver un valor producto de su llamada.
Puede o no tener parmetros
Expresiones lambda
Sintaxis de expresiones lambda
(parmetros de entrada) => expresin | bloque de sentencias
() => Console.Write(Hola) // Expresin lambda sin parmetros
x => x + 3 // Expresin lambda con un parmetro (no requiere parntesis)
(Precio, Descuento) => Precio (Precio * Descuento / 100.0)
(string Nombre, int Longitud) => Nombre.Length > Longitud
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 10
Cmo implementar expresiones lambda?
Con delegados El programador define explcitamente un
delegado que coincida con los parmetros y tipo de valor devuelto de la expresin lambda
Con delegados genricos integrados Se utilizan los delegados genricos integrados en
la librera de clase base (BCL) con la intencin de obviar la escritura de cdigo extra para un delegado y un mtodo
Cmo implementar expresiones lambda?
// Delegado definido por el programadordelegate double Delegado(int x, double y);
// Delegado definido por el programador con expresin lambdaDelegado miDelegado = (x, y) => x * y;
// Delegado genrico con expresin lambdaSystem.Func miDelegadoGenerico = (x, y) => x * y;
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 11
Ejemplo de aplicacin con una expresin lambda
Calcular el descuento de un artculo
Variables dblPrecio dblPorcentajeDescuento
Expresin lambda que calcula el descuento con delegado creado por el programador
// Definicin de un delegado
delegate double Calcular(double _dblPrecio, double_dblPorcentajeDescuento);
// Delegado con expresin lambda
Calcular CalcularDescuento = (Precio, Descuento) => Precio - (Precio * Descuento / 100.0);
// Ejecucin de la expresin lambda
Console.WriteLine("El precio del artculo (con el descuento aplicado) es "+CalcularDescuento(dblPrecio, dblPorcentajeDescuento).ToString("C"));
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 12
Expresin lambda que calcula el descuento con delegado genrico integrado
// Delegado genrico con expresin lambda
System.Func CalcularDescuentoGenerico = (Precio, Descuento) => Precio - (Precio * Descuento / 100.0);
Console.WriteLine("El precio del artculo (con el descuento aplicado) es " + CalcularDescuentoGenerico(dblPrecio,
dblDescuento).ToString("C"));
Utilizar unaexpresin lambdapara determinar eltipo de clculo arealizar
Otro ejemplo de aplicacin de una expresin lambda
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 13
Diagrama de clase en UML
Ntese que no seimplementan losmtodos paracalcular el rea ni elpermetro
El mtodo Calcular()utiliza un delegadopara realizar ambosclculos
class Circunferencia{
private double _dblRadio;
public double Radio{
get { return _dblRadio; }set { _dblRadio = value; }
}
// Delegadopublic delegate double Operacion();
// Mtodo que recibe como parmetro el cdigo// a ejecutar enviado a travs de una// expresin lambdapublic double Calcular(Operacion C)
{
return C();
}
}
Codificacin de la clase
Fundamentos de Programacin Orientada a Objetos en C# .NETEjemplos con aplicaciones visuales y de consola
Ing. Bruno Lpez Takeyas, M.C.http://www.itnuevolaredo.edu.mx/Takeyas 14
private void btnCalcular_Click(object sender, EventArgs e){
Circunferencia miCircunferencia = new Circunferencia();
try {miCircunferencia.Radio = double.Parse(txtRadio.Text);
}catch(Exception ex) {
MessageBox.Show(ex.Message);return;
}finally {
txtRadio.Clear();txtRadio.Focus();
}
if (radCalcularArea.Checked){
double dblArea = miCircunferencia.Calcular(() => Math.PI *
Math.Pow(miCircunferencia.Radio, 2));
MessageBox.Show("rea = " + dblArea);}
if (radCalcularPerimetro.Checked){
double dblPerimetro = miCircunferencia.Calcular(() => Math.PI *
miCircunferencia.Radio * 2);
MessageBox.Show("Permetro = " + dblPerimetro.ToString());}
}
Otros ttulos del autor
http://www.itnuevolaredo.edu.mx/Takeyas/Libro
Bruno Lpez Takeyastakeyas@itnuevolaredo.edu.mx
Recommended