Пример #1
0
        static void Main(string[] args)
        {
            System.Console.OutputEncoding = System.Text.Encoding.Unicode;
            System.Console.InputEncoding  = System.Text.Encoding.Unicode;

            // створюємо банківський рахунок
            Account account = new Account(200);

            // Додаємо в делегат посилання на метод Show_Message
            // а сам делегат передається як параметр методу RegisterHandler
            account.RegisterHandler(new Account.AccountStateHandler(Show_Message));
            // Два рази поспіль намагаємося зняти гроші
            account.WithdrawVer2(100);
            account.WithdrawVer2(150);

            // Передати декілька методів для визова
            account.RegisterHandler(new Account.AccountStateHandler(Show_Message) + new Account.AccountStateHandler(Show_Message));
            account.Put(100);
            // Два рази поспіль намагаємося зняти гроші
            Console.WriteLine($"\nМаємо два метода в делегаті");
            account.WithdrawVer2(100);
            account.WithdrawVer2(150);

            // Передати декілька методів для визова VER2
            Account accountVer2 = new Account(200);

            Account.AccountStateHandler colorDelegate =
                new Account.AccountStateHandler(Color_Message);

            // Додаємо в делегат посилання на метод
            accountVer2.RegisterHandlerVer2(new Account.AccountStateHandler(Show_Message));
            accountVer2.RegisterHandlerVer2(colorDelegate);

            Console.WriteLine($"\nМаємо два метода в делегаті Ver2");
            // Два рази поспіль намагаємося зняти гроші
            accountVer2.WithdrawVer2(100);
            accountVer2.WithdrawVer2(150);

            // видаляємо делегат
            accountVer2.UnregisterHandlerVer2(colorDelegate);
            Console.WriteLine($"\nПісля видалення метода colorDelegate");
            accountVer2.WithdrawVer2(50);

            Console.ReadKey();
        }
Пример #2
0
        static void Main(string[] args)
        {
            Account account = new Account(200);

            Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message);

            // Добавляем в делегат ссылку на методы
            account.RegisterHandler(new Account.AccountStateHandler(Show_Message));
            account.RegisterHandler(colorDelegate);
            // Два раза подряд пытаемся снять деньги
            account.Withdraw(100);
            account.Withdraw(150);

            // Удаляем делегат
            account.UnregisterHandler(colorDelegate);
            account.Withdraw(50);

            Console.ReadLine();
        }
Пример #3
0
        static void exampleColor()
        {
            Console.WriteLine("\nПример с цветом");

            Account account = new Account(200);

            Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message);

            // Добавляем в делегат ссылку на методы
            account.RegisterHandler(new Account.AccountStateHandler(Show_Message));
            account.RegisterHandler(colorDelegate);
            // Два раза подряд пытаемся снять деньги
            account.Withdraw(100);
            account.Withdraw(150);

            // Удаляем делегат
            account.UnregisterHandler(colorDelegate);
            account.Withdraw(50);
        }
Пример #4
0
        static void Main(string[] args)
        {
            // Создадим банковский счёт
            Account account = new Account(200);

            Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message);

            // Добавим в делегат ссылку на метод Show_Message
            // а сам делегат передаётся в качестве параметра метода RegisterHandker
            account.RegisterHandler(new Account.AccountStateHandler(Show_message));
            account.RegisterHandler(colorDelegate);

            // Два раза подряд пытаемся снять деньги
            account.Withdraw(100);
            account.Withdraw(150);

            // Удаляем делегат
            account.UnregisterHandler(colorDelegate);
            account.Withdraw(50);

            Console.ReadLine();
        }
Пример #5
0
        static void Main(string[] args)
        {
            //Примеры функционала делегата - обозначены в комментариях знаком >>>

            Console.WriteLine("----------------------------------------------------------");
            //>>> Функционал делегата - указатель на другой метод

            //Создаём переменную созданного делегата
            Message message;

            if (DateTime.Now.Hour < 10)
            {
                message = textHello;
            }
            else
            {
                message = textByeBye;
            }

            //Выполнение метода из списка вызовов делегата
            message();


            Console.WriteLine("----------------------------------------------------------");
            //>>> Функционал делегата - делигирование классом выполнения некоторого кода извне

            //(Определяем дополнительную логику извне для выполнение какого-то дейтсвия внутри другого класса)
            Account myAccount = new Account(400);

            Account.AccountStateHandler colorDelegat = new Account.AccountStateHandler(colorMessage);

            //Для первого метода в списке делегат передаём объект, в котором инициализируем переменую делегата
            myAccount.registerHandler(new Account.AccountStateHandler(showMessage));

            //>>> Функционал делегата - добавление, удаление и поочередное выполнение нескольких методов в списке делегатов

            //В методе registerHandler() добавляем метод список вызовов делегата
            myAccount.registerHandler(colorDelegat);
            myAccount.withdraw(200);
            myAccount.withdraw(100);

            //В методе unregisterHandler() удаляем метод из списка вызовов делегата
            myAccount.unregisterHandler(colorDelegat);
            myAccount.withdraw(250);

            Console.WriteLine("----------------------------------------------------------");
            //>>> Функционал делегата - выполнение анонимных методов, которые позволяют создавать готовые экземрляры готов делегатов
            //(Объявление анонимного метода начинается с delegate())
            MessageWithText messageWithText = delegate(string text) {
                Console.WriteLine(text);
            };

            messageWithText("Зупуск анонимный метод!");

            Console.WriteLine("----------------------------------------------------------");
            //>>> Функционал делегата - использование с лямбда-выражениями, которые являются упрощённой запись анонимных методов

            Operatin operation = (x, y) => x * y;   //Лямбда-выражение для опеределение операции умножение двух чисел

            Console.WriteLine("Результат умножение двух чисел - {0}", operation(10, 2));

            //Интересно - если мы доабвим в список выполнения доп.метод, то результат операций выведетя только для последнего метода
            operation += (x, y) => x + y;           //Лямбда-выражение для опеределения операции сложения двух чисел
            Console.WriteLine("В списке выполенения делегата несколько методов, но результат только последнего, это сложение - {0}", operation(153, 47));

            Console.WriteLine("----------------------------------------------------------");

            Console.ReadKey();
        }
Пример #6
0
        static void Main()
        {
            /* Пример 1 */
            Console.WriteLine("Пример 1: ");

            Message message;                // Создаём переменную делегата

            if (DateTime.Now.Hour < 12)
            {
                message = GoodMorning;      // Присваиваем этой переменной адрес метода
            }
            else
            {
                message = GoodEvening;
            }
            message();                      // Вызываем метод

            /* Пример 2 */
            Console.WriteLine("Пример 2: ");

            Operation operation = Add;             // Указание на метода ADD
            int       result    = operation(4, 5); // Add 4 5

            Console.WriteLine(result);
            operation = Multiply;           // Указание на метод Multiply
            result    = operation(4, 5);    // Multiply 4 5
            Console.WriteLine(result);

            /* Пример 3 */
            Console.WriteLine("Пример 3: ");

            Math       math       = new Math();
            Operation2 operation2 = math.Sum;   // указание делегата на другой класс, где он не обьявлен
            int        result2    = operation2(4, 5);

            Console.WriteLine(result2);

            /* Пример 4 */
            Console.WriteLine("Пример 4: ");

            message  = Hello;               // Указываем на метод hello
            message += HowAreYou;           // добавляем к нему метод howareyou
            message();                      // Hello How Are you? в 2 строчки т.к вызываеются оба метода
            message += Hello;
            message += Hello;
            message();                      // 3 раза вызывается Hello и один раз HowAreYou
            message -= HowAreYou;
            message();                      // 3 раза вызывается Hello

            Message message1 = Hello;
            Message message2 = HowAreYou;
            Message message3 = message1 + message2; // Объединение делегатов значит, что в список вызова делегата mes3 попадут все методы из делегатов mes1 и mes2.

            message3();

            /* Пример 5 */
            Console.WriteLine("Пример 5: ");

            Message message4 = Hello;

            message4.Invoke(); // Другой способ вызова делегатов
            Operation operation3 = Add;
            int       result3    = operation3.Invoke(3, 4);

            Console.WriteLine(result3);
            Message message5 = null;

            message5?.Invoke(); // При вызове делегата лучше проверять не равен ли он null не то исключение

            /* Пример 6
             * Анонимный метод */
            Console.WriteLine("Пример 6: ");

            MessageHandler handler = delegate(string mes)  // Создание анонимного метода delegate ключевое слово
            {
                Console.WriteLine(mes);
            };

            handler("Hello World");

            ShowMessage("Hello", delegate(string mes)    // Другой пример анононимных методов - передача в качестве аргумента для параметра
            {
                Console.WriteLine(mes);
            });

            /* Если анонимный метод использует параметры, то они должны соответствовать параметрам делегата.
             *  Если для анонимного метода не требуется параметров, то скобки с параметрами можно опустить
             * даже если делегет принимает несколько параметров исключение in out*/

            MessageHandler handler1 = delegate
            {
                Console.WriteLine("Анонимный метод");
            };

            handler1("Hello world");
            /* Так же как и обычное методы, анонимные могут возвращать результат */
            Operation operation1 = delegate(int x, int y)
            {
                return(x + y);
            };
            int d = operation1(4, 5);

            Console.WriteLine(d);
            /* При этом анонимный метод имеет доступ ко всем переменным, определенным во внешнем коде*/
            int       z          = 8;
            Operation operation4 = delegate(int x, int y)
            {
                return(x + y + z);
            };
            int j = operation4(4, 5);

            Console.WriteLine(j);   // 17

            /* Упражнение 1 */

            Console.WriteLine("Упражение 1: ");
            Account accout = new Account(200);

            Account.AccountStateHandler colorDelegate = new Account.AccountStateHandler(Color_Message);

            /* Добавляем в делегат ссылку на методы */

            accout.RegisterHandler(new Account.AccountStateHandler(Show_Message));
            accout.RegisterHandler(colorDelegate);

            /* 2 раза снимаем деньги */

            accout.withdraw(100);
            accout.withdraw(150);

            /* Удаляем делегат */

            accout.UnregisterHandler(colorDelegate);
            accout.withdraw(50);
        }