Что такое методы обратного вызова? - PullRequest
24 голосов
/ 01 декабря 2010

Я нуб-программист и не совсем понял концепцию методов обратного вызова. Пробовал читать об этом в вики, и это пошло мне на ум. Может кто-нибудь объяснить это простыми словами?

Ответы [ 5 ]

21 голосов
/ 01 декабря 2010

Обратный вызов - это то, что вы передаете функции, которая сообщает, что она должна вызывать в какой-то момент своей работы.Код в функции решает, когда вызывать функцию (и какие аргументы передавать).Как правило, способ сделать это - передать самой функции в качестве «обратного вызова» на языках, где функции являются объектами.В других языках вам, возможно, придется передать какую-то особую вещь, называемую «указатель на функцию» (или подобный);или вам может потребоваться передать имя функции (которая затем просматривается во время выполнения).

Тривиальный пример в Python:

void call_something_three_times(what_to_call, what_to_pass_it):
    for i in xrange(3): what_to_call(what_to_pass_it)

# Write "Hi mom" three times, using a callback.
call_something_three_times(sys.stdout.write, "Hi mom\n")

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

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

11 голосов
/ 01 декабря 2010

Wiki говорит:

В компьютерном программировании обратный вызов - это ссылка на исполняемый код или фрагмент исполняемого кода, который передается в качестве аргумента другому коду.Это позволяет низкоуровневому программному уровню вызывать подпрограмму (или функцию), определенную на высокоуровневом уровне.

В общих чертах это механизм уведомления части кода, то есть метода,какой фрагмент кода выполнять, т. е. другой метод, когда это необходимо.
Обратный вызов связан с тем фактом, что клиент вызывающей функции определяет функцию, которая относится к ответственности клиентского кода перед вызывающей функцией, и этопередается в качестве аргумента.
Пример - в графическом интерфейсе.Вы передаете в качестве аргумента функцию, которая должна быть вызвана при возникновении события (например, при нажатии кнопки), и как только событие происходит, эта функция вызывается.
Эта функция обычно реализуется объектом, который первоначально зарегистрирован для события

5 голосов
/ 01 декабря 2010

Функция обратного вызова - это функция, которая вызывается через указатель на функцию. Если вы передаете указатель (адрес) функции в качестве аргумента другому, когда этот указатель используется для вызова функции, на которую он указывает, говорят, что обратный вызов сделан.

Почему вы должны использовать функции обратного вызова?

Обратный вызов может использоваться для уведомлений. Например, вам нужно установить таймер в вашем приложении. Каждый раз, когда таймер истекает, ваше приложение должно быть уведомлено. Но разработчик механизма time -rs ничего не знает о вашем приложении. Ему нужен только указатель на функцию с заданным прототипом, и при использовании этого указателя он выполняет обратный вызов, уведомляя ваше приложение о произошедшем событии. Действительно, SetTimer () WinAPI использует функцию обратного вызова для уведомления о том, что таймер истек (и, если функция обратного вызова не предусмотрена, он отправляет сообщение в очередь приложения).

1 голос
/ 01 декабря 2010

Обратный вызов означает, что вы передаете код в качестве параметра. Например, представьте кнопку, которая при нажатии отображает диалоговое окно:

Button testBtn;
testBtn.setOnClickListener(new OnClickListener() {

  @Override
  public void onCLick() {
    JOptionPane.showDialog(testBtn, "Test button pressed");
  }
}

Здесь мы сообщаем кнопке, что выполнять, когда она будет нажата. Таким образом, фреймворк выполнит переданный код, когда обнаружит щелчок. Внутри фреймворка есть код вроде:

void processEvent(Event e) {
  if (e.type == Event.CLICK) {
    e.getComponent().getOnClickListener().onClick();
  }
}

Итак, некоторый базовый код перезванивает слушателю, когда происходит соответствующее событие.

PS: псевдокод здесь, просто опишите идею.

1 голос
/ 01 декабря 2010

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

В коде C вы передаете нечто, похожее на это:

int (callback *)(void *, long );

, означающее функциюпринимает два параметра, void * и long и возвращает int.

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

Современные языки используюттермин «делегат» для обозначения функции «шаблон».Они могут быть использованы в качестве обратных вызовов.В некоторых языках также используется термин lambda, который по сути является функцией без имени, часто создаваемой «на лету» в блоке кода и передаваемой в качестве обратного вызова.C++11 ввел их в свой стандарт.

Преимущество использования обратного вызова состоит в том, что вы можете отделить, т.е. уменьшить / отделить API от того, что его вызывает, и в некоторой степени наоборот, т.е. хотяв одном месте вы знаете, что вызываете API, в точке «обработчика» ему не нужно знать, откуда он был вызван.

Например, у вас может быть API, который генерирует объекты изатем "обратный вызов", как они генерируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...