Насколько я понимаю, вы спрашиваете, как события работают под прикрытием. Вы не указали, о каком языке / платформе вы спрашиваете, поэтому я собираюсь ответить тем, что знаю (.Net), хотя я уверен, что многие платформы похожи, помните, что то, что я говорю, может быть правда везде.
Я начну с самого низкого уровня и буду работать вверх.
Функциональные указатели
В большинстве языков существует понятие указателя на функцию. В таких языках, как C ++, вы можете буквально хранить указатель на адрес памяти метода. В функциональных языках, таких как Lisp или F #, функции являются ключевыми, и это важная часть языка, которую вы можете хранить и передавать по ссылкам на функции. В .net указатели на функции реализованы с использованием делегатов.
1012 * Делегаты *
В .Net события реализуются с использованием делегатов. делегат - это указатель на функцию безопасного типа. Это указатель на функцию, которая ограничена определенным типом и проверяется на соответствие этому типу во время компиляции. Вы можете вызвать делегат, и это вызовет функцию, на которую он указывает.
Multicast
A многоадресный делегат - это класс, который формирует коллекцию делегатов. Он использует список для хранения нескольких делегатов. Когда вы вызываете add
или делаете +=
, вы просто добавляете свой новый делегат (указатель функции) во внутренний список многоадресной рассылки. Многоадресные экземпляры делегатов могут быть запущены, и он просто перемещается вниз по списку и запускает внутренне каждый делегат в последовательности.
Событие
Событие - это просто ключевое слово, которое добавляет несколько дополнительных ограничений поверх делегата многоадресной рассылки, который лежит в основе события. Например (среди прочего), используя ключевое слово event, когда вы объявляете экземпляр делегата многоадресной рассылки, он ограничивает его, так что его можно запускать только из класса, в котором он объявлен.
Итак, подведем итоги. События - это просто список функциональных указателей. Когда вы подписываетесь, вы просто добавляете указатель на вашу функцию в список. Когда событие инициируется, оно просто перемещается вниз по списку и запускает каждый указатель функции, о котором он знает.
Очевидно, как я уже говорил в начале, каждый язык / среда будет отличаться, но я не удивлюсь, если идея поддержания простых списков указателей на функции, вероятно, будет довольно распространенной.
У Джона Скита есть отличная статья о событиях в .Net , которую вы должны прочитать для получения дополнительной информации, если интересует эта платформа.