none
Eventos c# RRS feed

  • Pregunta

  • Podria apoyarme a realizar este ejercicio que estoy haciendo, primero les muestro la clase empleado

    public class Empleado
    {
    	public int Id { get; set; }
    	public string Nombre { get; set; }
    	public string ApellidoPaterno { get; set; }
    	public double Salario { get; set; }
    }


    ahora les muestro la clase Pagador

    public class Pagador
    {
    	public void Pagar(List<Empleado> empleados)
    	{
    		foreach (var empleado in empleados)
    		{
    			empleado.Salario = 100;
    		}
    	}
    }


    ahora les muestro el main

    class Program
    	{
    		static void Main(string[] args)
    		{
    			List<Empleado> empleados = new List<Empleado>();
    			Empleado Sergio = new Empleado()
    			{
    				Id = 1,
    				ApellidoPaterno = "Melendez",
    				Nombre = "Sergio"
    			};
    
    			Empleado Silvia = new Empleado()
    			{
    				Id = 2,
    				ApellidoPaterno = "Torres",
    				Nombre = "Silvia"
    			};
    
    			Empleado Juan = new Empleado()
    			{
    				Id = 3,
    				ApellidoPaterno = "Duran",
    				Nombre = "Juan"
    			};
    
    			empleados.Add(Sergio);
    			empleados.Add(Silvia);
    			empleados.Add(Juan);
    
    			Pagador pagador = new Pagador();
    
    			pagador.Pagar(empleados);
    		}
    	}

    como pueden ver el objeto pagador por medio del metodo pagar recibe una lista y les da 100 pesos o dolares lo que quieran ya les pago

    lo que yo busco es tener una clase registrador que cuando pagador pague diga ya pague y esta entonces esta clase hace esto

    public class Registrador
    	{
    		public void Registrar(Empleado empleado)
    		{
    			string resultado = "Nombre: " + empleado.Nombre + " " + "Salario " + empleado.Salario;
    		}
    	}

    recibe al empleado y lo registra en base de datos, claro el codigo no lo hace pero es solo un ejercicio

    como puedo hacer para que el metodo registrar se execute cada que pagador asigne un nuevo salario.

    No quiero llamar dentro de Pagador a Registrador y llamar a su metodo, lo que quiero es que pagador notifique diga ya pague y esta clase haga su trabajo, algo asi como un delegado y un evento, el problema es que no lo visualizo

    podrian apoyarme

    viernes, 28 de septiembre de 2018 6:05

Respuestas

  • Una solucion sencilla no utiliza un delegado ni un evento, sino el "Setter" de la propiedad Salario. en lugar de la propiedad automática {get;set;} puedes expandirla y meter codigo dentro del set, de forma que cada vez que se cambie el salario desde cualquier sitio se ejecuta ese codigo. Desde ahi puedes llamar al registrador.

    Si lo quieres con un evento desde el pagador, declara un delegado publico, y dentro de la clase pagador declara un evento publico del tipo del delegado. Dentro del metodo Pagar, disparas el evento. Y en el Registrador, te suscribes al evento para recibirlo cada vez que se dispare. Eso requiere que el registrador conozca la instancia del pagador, que se la tendrias que pasar desde el Main, para que a traves de esa instancia pueda "ver" el evento.

    No te pongo el codigo completo por tratarse de un ejercicio. Ponnos el intento que hayas hecho y si algo no esta bien ya te indicamos que es lo que hay que cambiar y por que.

    viernes, 28 de septiembre de 2018 11:15
    Moderador

Todas las respuestas

  • Una solucion sencilla no utiliza un delegado ni un evento, sino el "Setter" de la propiedad Salario. en lugar de la propiedad automática {get;set;} puedes expandirla y meter codigo dentro del set, de forma que cada vez que se cambie el salario desde cualquier sitio se ejecuta ese codigo. Desde ahi puedes llamar al registrador.

    Si lo quieres con un evento desde el pagador, declara un delegado publico, y dentro de la clase pagador declara un evento publico del tipo del delegado. Dentro del metodo Pagar, disparas el evento. Y en el Registrador, te suscribes al evento para recibirlo cada vez que se dispare. Eso requiere que el registrador conozca la instancia del pagador, que se la tendrias que pasar desde el Main, para que a traves de esa instancia pueda "ver" el evento.

    No te pongo el codigo completo por tratarse de un ejercicio. Ponnos el intento que hayas hecho y si algo no esta bien ya te indicamos que es lo que hay que cambiar y por que.

    viernes, 28 de septiembre de 2018 11:15
    Moderador
  • hola

    podrias asignar el registrador por medio del constructor, algo como ser

    public interface IRegistrar{
    
        void Registrar(Empleado empleado);
    
    }
    
    public class Registro : IRegistrar{
    
       //codigo
    
    }



    entonces usarias

    public class Pagador
    {
        private readonly IRegistrar _registro;
    	
        public Pagador(IRegistrar registro)
    	{
    		_registro = registro;
    	}
    	
    	public void Pagar(List<Empleado> empleados)
    	{
    		foreach (var empleado in empleados)
    		{
    			empleado.Salario = 100;
    			_registro.Registrar(empleado);
    		}
    	}
    }

    la idea de usar interfaces es para poder cambiar la implementacion del registrador

    IRegistrar registro = new Registrador();

    Pagador pagador = new Pagador(registro);

    para lo que quieres hacer no se usa ningun evento

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 28 de septiembre de 2018 16:19