static void Main(string[] args)
        {
            // Instancia um objeto publicador de evento
            Classe_Publisher publisher = new Classe_Publisher();

            // Instancia um objeto de assinante de evento
            Classe_Subscriber subscriber = new Classe_Subscriber();

            // Inscreva no evento publisher.EventName criando o método subscriber.OnMethodName
            // um destino do delegado publisher.EventName
            publisher.EventName += subscriber.OnMethodName;

            // Chama o método ChecarAlgo no objeto publisher
            // chamará o delegado publisher.EventName se o saldo for superior a 250
            publisher.ChecarAlgo(251);

            Console.WriteLine();
            Console.WriteLine("======TESTE: classe Room=====");

            Room room = new Room();

            // Instancia um objeto de assinante de evento
            Room_Subscriber room_subscriber = new Room_Subscriber();

            room.EventName += room_subscriber.OnMethodName;
            room.EventName += room_subscriber.OnShow;
            room.EventName += room_subscriber.OnDisplay;

            room.Temperature = 90;
            room.Temperature = 15;

            Console.ReadKey();
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            // Instancia um objeto publicador de evento
            Classe_Publisher publisher = new Classe_Publisher();

            // Instancia um objeto de assinante de evento
            Classe_Subscriber subscriber = new Classe_Subscriber();

            // Inscreva no evento publisher.EventName criando o método subscriber.OnMethodName
            // um destino do delegado publisher.EventName
            publisher.EventName += subscriber.OnMethodName;

            // Chama o método ChecarAlgo no objeto publisher
            // chamará o delegado publisher.EventName se o saldo for superior a 250
            publisher.ChecarAlgo(251);


            //O EVENTO trata esses 2 problemas dos delegates
            //1.	Qualquer um pode usar um operador de atribuição
            //      que pode sobrescrever as referências de métodos.
            Console.WriteLine();
            Console.WriteLine("======Problema delegate: Sobrescreve metodo associados======");
            Action act = Display;

            act += Show;
            act += Display;
            act();

            Action act_erro = Display;

            act_erro += Show;

            Console.WriteLine("Aqui não tem o +");
            act_erro = Display;
            act_erro();

            //2.	O delegado pode ser chamado em qualquer lugar do código,
            //      o que pode violar a regra do encapsulamento.
            Console.WriteLine();
            Console.WriteLine("======Problema delegate: Pode ser chamado em qualquer lugar do código======");

            Room room = new Room();

            room.OnHeatAlert = Alarm;

            // Instancia um objeto de assinante de evento
            Room_Subscriber room_subscriber = new Room_Subscriber();

            room.EventName += room_subscriber.OnMethodName;
            room.EventName += room_subscriber.OnShow;
            room.EventName += room_subscriber.OnDisplay;
            room.EventName += room_subscriber.OnShow;

            //NÃO é possível sobrescrever as referências de métodos.
            //room.EventName = room_subscriber.OnShow;

            // OnHeatAlert será chamado
            room.Temperature = 90;
            room.Temperature = 15;
            // OnHeatAlert será chamado novamente o que não deveria ocorrer
            // porque o quarto não está quente (temp> 60) no set do valor Temperature
            // Temperature é propriedade de Room. Delegado é chamado fora da classe Room
            room.OnHeatAlert(room.Temperature);

            Console.WriteLine("======RESOLVIDO Problemas de delegate COM EVENTOS======");

            Console.ReadKey();
        }