Для того, чтобы программировать, нужно знать определенные языки и их особенности. Важную роль здесь играют не только объекты и функции, но и так называемые события.

В данной статье речь зайдет о том, что такое event. Примеры будут разобраны на языках СИ-семейства – C# и C++. Это одни из самых перспективных ЯП в сфере объектно-ориентированного программирования.

Термины – базовые понятия

Перед тем, как с помощью предложенных языков писать программы и использовать обработчик событий, необходимо сначала научиться базовым приемам создания софта. А еще – запомнить несколько ключевых терминов.

Каждый разработчик должен помнить следующие определения:

  1. Алгоритм – набор операций и инструкций, а также указаний, с помощью которого удается решать поставленные изначально задачи.
  2. API — интерфейс прикладного программирования. Представлен правилами и инструкциями, помогающими создавать утилиты.
  3. Аргументы – значения, передаваемые в команды и функции.
  4. Оператор – то, что манипулирует компонентами кода через операнды.
  5. Операнд – объект, которым можно управлять через операторы.
  6. Переменная – именованная ячейка памяти, которая зарезервирована системой. Хранилище данных в программе.
  7. Объект – связанные между собой переменные, структурные единицы и константы, которые выбираются совместно, а также обрабатываются.
  8. Класс – набор связанных объектов. У них должны быть общие свойства.
  9. Тип данных – классификация электронных материалов определенного вида.
  10. Массив – множество информации. Списки и группы схожих типов данных, которые предварительно проходят стадию группировки.
  11. Итерация – один проход через заданный набор операций в коде.
  12. Ключевое слово – зарезервированное синтаксисом ЯП слово. Помогает обозначать операции и функции. Ключевое слово не может выступать в качестве имени класса, переменной или иного компонента.
  13. Указатели – переменные, содержащие адреса мест в памяти.

Также стоит обратить внимание на раскрытие понятия «метод». Это в объектно-ориентированном программировании – функция/процедура, которая относится к тому или иному классу, объекту. Включает в себя операторы и входные аргументы.

Событие – это…

Событие – член типа при помощи которого соответствующий тип или его экземпляр могут уведомлять иные объекты о наступлении особых ситуаций. Пример – возникновение ошибок или сбоев в системе, клик по кнопке.

Другие объекты в написанном коде при получении сообщения о событии могут давать «обратный ответ». А именно – выполнять те или иные действия. Под событием принято понимать член типа, отвечающий за обеспечение соответствующего взаимодействия компонентов в коде.

Событие:

  • сообщение, возникающее в различных точках исходного кода при выполнении заданных условий;
  • переход объекта или класса из одного состояния в другое;
  • абстракция инцидента или сигнала в реальном мире, который сигнализирует о перемещении чего-либо в новое состояние.

Отдельное внимание стоит уделить типу, в котором прописано то или иное событие. Оно должно удовлетворять некоторым «условиям».

О типах и их возможностях

Тип, в котором было определено событие, позволяет:

  1. Производить регистрацию обработчика событий. К ним относят статические или экземплярные методы, которые заинтересованы в получении уведомления о событии. Выполняют в ответ на event конкретные операции.
  2. Отменять регистрацию компонента под названием «обработчик событий».
  3. Уведомлять обработчик (если их несколько – все) о том, что операция произошла.

Стоит обратить внимание на то, что в C++ нет событий. При необходимости разработчику предстоит создать соответствующие «компоненты» на библиотечном уровне. Чуть позже будет рассмотрен один такой вариант, который предусматривает несколько классов. К ним относят Delegate и Event.

Делегаты

Модель event в C# базируется на делегатах. Аналогичным образом ситуация обстоит с .NET. Делегат – это тип, который содержит ссылку на метод. Он:

  • объявляется при помощи сигнатуры, указывающий тип возвращаемого значения и параметры для методов, на которые происходит ссылка;
  • способен включать в себя лишь ссылки на методы, соответствующие сигнатуре;
  • эквивалентен указателю на строго типизированные функции или обратные вызовы.

Для того, чтобы объявить делегат, достаточно определить его класс. В .NET соответствующий компонент имеет широкую область применения, как и в C#.

Вот пример объявления делегата в C#:

Public delegate void ThresholdReachedEventHander(object sender, ThresholdReachedEventArgs e);

Стоит обратить внимание на то, что сценарии, для которых требуется определять собственные делегаты, встречаются на практике крайне редко. Пример – когда ведется работа с кодом, не умеющим распознавать универсальные типы.

События – ключевые моменты

Стоит обратить внимание на то, как правильно осуществлять работу с events. Далее будет представлена информация, помогающая обрабатывать «сообщения системы», объявлять их и корректировать при необходимости.

Определение и вызов

События в классе будут объявляться при помощи ключевого слова – event. После него требуется указать тип делегата, который представляет «происшествие».

События и делегаты в С# и C++

Здесь:

  1. Есть public class.
  2. В самом начале осуществляется определение делегата AccountHandler. Он будет принимать один параметр вида string.
  3. При помощи ключевого слова происходит создание некоторого event с именем Notify. Оно представляет delegate.
  4. Название события может выступать в качестве произвольного. Оно обязательно представляет тот или иной делегат.

После того, как событие оказалось определено, можно его вызвать как метод. Для этого необходимо использовать имя события. Чтобы избежать ошибок в момент, когда осуществляется обработка «сообщения», стоит проверять его на null:

События и делегаты в С# и C++

Можно вызвать event через метод Invoke(). Для этого предстоит передать в него желаемые значения для параметров.

А вот программа, которая послужит примером реализации рассмотренных операций:

class Account
{
    public delegate void AccountHandler(string message);
    public event AccountHandler? Notify;              // 1.Определение события
    public Account(int sum) => Sum = sum;
    public int Sum { get; private set; }
    public void Put(int sum)
    {
        Sum += sum;
        Notify?.Invoke($"На счет поступило: {sum}");   // 2.Вызов события 
    }
    public void Take(int sum)
    {
        if (Sum >= sum)
        {
            Sum -= sum;
            Notify?.Invoke($"Со счета снято: {sum}");   // 2.Вызов события
        }
        else
        {
            Notify?.Invoke($"Недостаточно денег на счете. Текущий баланс: {Sum}"); ;
        }
    }
}

Система здесь получит уведомление о том, что средства добавлены/сняты со счета. Также система выдаст сообщение, если на балансе недостаточно денег.

Как добавить обработчик

В программировании можно добавлять один или несколько обработчиков. Это – то, что будет выполняться при вызове «происшествия». Часто это не классы, а методы. Каждый обработчик событий по списку заданных параметров и возвращаемому типу будет соответствовать делегату, которые представляет событие. Для того, чтобы добавить обработчик, нужно применить операцию «+=».

События и делегаты в С# и C++

Здесь:

  1. Используется метод DisplayMessage. Он соответствует delegate AccountHandler.
  2. При вызове данных события будет обрабатываться соответствующий метод. Для параметра message передается строчка, встречающаяся в event.
  3. В DisplayMessage осуществляется вывод полученного сообщения. При желании можно определить здесь совершенно любую логику.

После этого можно выделить самостоятельный класс Account в качестве библиотеки классов. После – использовать в своих проектах.

Удаление

В любой момент программист может провести создание или удаление обработчиков. Для удаления необходимо использовать операцию «-=».

События и делегаты в С# и C++

Выше – то, как будет выглядеть соответствующий код.

Управление

Обработка events при помощи аксессоров может управляться разработчиком. Для этого используется add или remove. Такая функциональность встречается на практике редко. Здесь можно увидеть, как происходит удаление и добавление обработчика подобным образом.

Можно также передавать некоторые данные об events. Пример – добавление в программы, указанные выше, new класс AccountEventArgs. Он будет содержать такой код:

События и делегаты в С# и C++

Этот класс обладает двумя свойствами:

  • Message – хранение выводимого сообщения;
  • Sum – содержит сумму, на которую изменился баланс.

Теперь можно применить класс AccountEventArgs, откорректировав класс Account:

События и делегаты в С# и C++
События и делегаты в С# и C++

Основная программа должна выглядеть так:

События и делегаты в С# и C++

Как быть с C++

Обработка events в C++ — это более сложное понятие. Связано это с тем, что обработчиков у этого языка программирования нет. Предстоит работать с различными классами. Пример – Delegate и Event.

Класс Delegate

Этот класс будет расширять понятие указателя на функцию. С его помощью удается передавать ссылки на методы объектам-делегатам. Далее последний может быть передан клиентскому коду, который косвенно вызывает метод.

Класс Delegate дает существенное преимущество – ему можно передавать динамически указатели на методы и изменять поведение приложения. Перекомпиляция здесь не нужна. Софт будет оставаться в неведении о манипуляциях.

События и делегаты в С# и C++

Выше – пример использования класса Delegate.

Класс Event

Событие – способ для класса относительно оповещения клиентов о том, что что-то произошло. Можно использовать Event в C++ для реализации рассматриваемого «компонента».

В данном случае сторонний объект будет помещать указатель на свой метод в делегат. После – передавать последний событию. При срабатывании события осуществляется вызов делегата. Как следствие – метода, который ему был передан.

События и делегаты в С# и C++
События и делегаты в С# и C++
События и делегаты в С# и C++

Выше – пример использования класса Event в C++ для обработки событий. А вот – видео-урок по рассмотренной теме в C#. Чтобы надписи типа static void, eventargs e, delegate и другие не вызывали трудности, стоит закончить специализированные дистанционные компьютерные курсы. В течение года с нуля пользователя там научат писать коды на выбранных языках. Есть как предложения для новичков, так и для опытных разработчиков.

События и делегаты в С# и C++
События и делегаты в С# и C++