История событий

Сначала была функция для вызова срабатывающего кода.

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

Затем появились структуры с указателями на функции. Можно было делать несколько структур в списке и в каждой структуре было по функции. Можно было вызывать в цикле несколько функций подряд.

Дальше появились в ООП классы с виртуальными функциями. Можно было хранящиеся данные, в объекте классов, обрабатывать в этих функциях. И вызывать их по указатель на объект класса.

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

Появились события и делегаты. Делегаты задавали возможность описать функции для ссылки на них. Делегаты были типами событий. События не были доступны для вызова как член класса из вне, но можно было добавлять и снимать привязки функций. А вызов был в специальной внутренней для объекта функции On_Event._