05.- delegados en c#

14
Fundamentos de Programación Orientada a Objetos en C# .NET Ejemplos con aplicaciones visuales y de consola Ing. Bruno López Takeyas, M.C. http://www.itnuevolaredo.edu.mx/Takeyas 1 CAPÍTULO 8 DELEGADOS 2

Upload: alex-noyola-estrada

Post on 26-Sep-2015

241 views

Category:

Documents


0 download

DESCRIPTION

Introduccion a los delegados en C# usando el paradigma orientado a objetos.

TRANSCRIPT

  • 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 [email protected]