В общем случае вы предоставляете функцию в качестве параметра, который вызывается при возникновении чего-либо.
В коде C вы передаете нечто, похожее на это:
int (callback *)(void *, long );
, означающее функциюпринимает два параметра, void * и long и возвращает int.
В объектно-ориентированных языках синтаксис иногда проще.Например, вы можете создать механизм обратного вызова, который позволяет пользователю передавать объект, который выглядит как функция или имеет абстрактный метод (таким образом, оборачивая функцию), а также данные контекста.
Современные языки используюттермин «делегат» для обозначения функции «шаблон».Они могут быть использованы в качестве обратных вызовов.В некоторых языках также используется термин lambda
, который по сути является функцией без имени, часто создаваемой «на лету» в блоке кода и передаваемой в качестве обратного вызова.C++11
ввел их в свой стандарт.
Преимущество использования обратного вызова состоит в том, что вы можете отделить, т.е. уменьшить / отделить API от того, что его вызывает, и в некоторой степени наоборот, т.е. хотяв одном месте вы знаете, что вызываете API, в точке «обработчика» ему не нужно знать, откуда он был вызван.
Например, у вас может быть API, который генерирует объекты изатем "обратный вызов", как они генерируются.