我们在设计软件系统架构的时候,经常需要用到回调函数。例如,我们设计了一个库,封装了一些接口。客户程序调用这些接口,我们的库执行一系列业务逻辑,并在调用结束的时候通知客户程序。
为了便于理解回调函数,我设计以下简单的例子:
为了便于理解回调函数,我设计以下简单的例子:
#include "stdafx.h"
// 函数指针
typedef int (*MYCALLBACK) (int a, int b);
// 回调函数调用函数
// 可以看作是DLL提供的接口
void testCallback (MYCALLBACK fun)
{
fun(1,2);// 调用回调函数
}
// 回调函数
int callback(int a, int b)
{
printf ("我被回调了!\n");
return a + b;
}
int callback2(int a, int b)
{
printf ("我也被回调了!\n");
return a * b;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 调用接口函数
// 可以根据需要调用不同的回调函数
testCallback (callback);
testCallback (callback2);
return 0;
}
在.net中,引入了“委托”的概念来代替回调函数的功能。这个概念很形象,客户程序“委托”一个中间人把处理结果告诉自己。另外,委托是完全面向对象的,更容易理解。
// 函数指针
typedef int (*MYCALLBACK) (int a, int b);
// 回调函数调用函数
// 可以看作是DLL提供的接口
void testCallback (MYCALLBACK fun)
{
fun(1,2);// 调用回调函数
}
// 回调函数
int callback(int a, int b)
{
printf ("我被回调了!\n");
return a + b;
}
int callback2(int a, int b)
{
printf ("我也被回调了!\n");
return a * b;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 调用接口函数
// 可以根据需要调用不同的回调函数
testCallback (callback);
testCallback (callback2);
return 0;
}