什么是回调方法?

时间:2010-12-01 11:52:06

标签: language-agnostic methods callback

我是一个编程菜鸟,并不太了解回调方法背后的概念。尝试在维基中阅读它并且它超越了我的头脑。有人可以用简单的语言解释一下吗?

7 个答案:

答案 0 :(得分:20)

回调是你传递给函数的东西,它告诉它在它的操作中的某个点应该调用它。函数中的代码决定何时调用函数(以及要传递的参数)。通常,您执行此操作的方法是在函数为对象的语言中将函数本身作为“回调函数”传递。在其他语言中,您可能必须传递一种称为“函数指针”(或类似)的特殊事物;或者您可能必须传递函数的名称(然后在运行时查找)。

一个简单的例子,在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")

这个例子让我们将重复函数调用的任务与实际调用函数的任务分开。这不是很有用,但它证明了这个概念。

在现实世界中,回调被广泛用于线程库之类的东西,你可以使用回调来调用一些线程创建函数来描述线程将要做的工作。线程创建函数完成了设置线程所需的工作,然后安排新线程调用回调函数。

答案 1 :(得分:11)

维基说:

  

在计算机编程中,回调是   对可执行代码的引用,或者   一段可执行代码,即   作为参数传递给其他代码。   这允许较低级别的软件   图层调用子程序(或   功能)在更高级别定义   层

一般来说,它是一种机制,用于通知一段代码,即一种方法,在需要时执行哪一段代码,即另一种方法。
回调与以下事实有关:调用函数的客户端指定一个函数,该函数属于客户端代码对要执行的调用函数的责任,并将其作为参数传递。
一个例子是在GUI中。作为参数传递事件发生时要调用的函数(例如按下按钮)和事件 发生此功能被调用 此函数通常由最初为事件注册的对象实现

答案 2 :(得分:5)

回调函数是通过函数指针调用的函数。如果将函数的指针(地址)作为参数传递给另一个函数,当该指针用于调用它所指向的函数时,则表示会进行回调。

为什么要使用回调功能?

回调可用于通知。例如,您需要在应用程序中设置计时器。每次计时器到期时,都必须通知您的申请。但是,时间机制的实现者对您的应用程序一无所知。它只需要一个指向具有给定原型的函数的指针,并且在使用该指针时它会进行回调,通知应用程序有关已发生的事件。实际上,SetTimer()WinAPI使用回调函数来通知计时器已过期(并且,如果没有提供回调函数,它会将消息发布到应用程序的队列中。)

答案 3 :(得分:1)

通常,您提供一个函数作为参数,当某些事情发生时会被调用。

在C代码中,您将传递如下内容:

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

表示一个带有两个参数的函数,void *和long,并返回一个int。

对于面向对象的语言,语法有时更简单。例如,您可能能够构造一个回调机制,允许用户传入一个看起来像函数的对象,或者有一个抽象方法(因此包装一个函数)和上下文数据。

现代语言使用术语“委托”来表示函数“模式”。这些可以用作回调。有些语言也使用术语lambda,它本质上是一个没有名称的函数,通常在代码块中“动态”创建并作为回调传递。 C++11已将这些引入其标准中。

使用回调的优点是你可以分离出来,即减少/解耦API与调用它,在某种程度上反之亦然,即尽管在一个地方你知道你正在调用API, “处理程序”的要点,它不需要知道它被调用的位置。

例如,您可以拥有一个生成对象的API,然后在生成时“回调”。

答案 4 :(得分:1)

回拨意味着您将代码作为参数传递。例如,想象一个按钮,按下时会显示一个对话框:

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:Pseudocode在这里,只是描述一下这个想法。

答案 5 :(得分:0)

回调方法是在事件发生时调用的方法

答案 6 :(得分:0)

简单来说,回调实际上是对函数或方法的引用,您可以将其作为参数传递给另一个函数,以便稍后回调。

enter image description here

从上图中,B_reference()是回调方法。

源代码示例:

>>> def A(A_msg,B_reference):
...  # After printing message, method B is called.
...  print(A_msg)
...  B_reference()
...

>>> def B():
...  print("Message from B")
...
>>>
>>> A("Message from A",B)
Message from A
Message from B
>>>

如果你还是不明白它是什么,你可以查看this video