C++和C#中的回调函数

34 篇文章 0 订阅

       什么是回调?有人这么说:“发布者说,当我遇到什么事的时候,我就通知大家,有需要通知的就把电话号码给我,等那件事发生时,我就打电话通知大家;”。

       而在这篇文章中则详细介绍了什么是回调函数以及回调函数的机制:http://shudingbo.spaces.live.com/blog/cns!C33400475B08F157!423.entry

       1. 什么是回调函数

    回调函数(callback Function),顾名思义,用于回调的函数。 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性:

  •     属于工作流的一个部分;
  •     必须按照工作流指定的调用约定来申明(定义);
  •     他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能;  

       2. 回调机制

    回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。

     如上图所示,工作流提供了两个对外接口(获取参数、显示结果),以回调函数的形式实现。

  • “获取参数”回调函数,需要工作流使用者设定工作流计算需要的参数。
  • “显示结果”回调函数,提供计算结果给工作流使用者。

       3. 回调机制应用

       使用回调机制,可以为工作流实现扩展。 可以把工作流中需要用户干预的,或需要提供给用户的数据以回调的模式提供给用户。而用户不需要知道整个工作的流程,只需知道回调函数的说明就可以使用工作流模块提供的功能,这对信息的隐藏也是有作用的。

       4. 回调机制的实现形式

    •     回调函数
    •     虚拟函数
    •     事件
    •     example1: 以虚函数实现回调机制语言C++)
      class CWorkFlow
      {
          void init()
           {
               _a = 0;
               _b = 0;
           }
      
          int _a;
          int _b;
      public:
      
          void Start()
           {
               //   初始化
                init(); 
               // 调用处理数据
                Handle( a, b );
               // 报告结果
                Report( a, b );
           }
      
          virtual void Handle( int &a, int &b ) = 0;
          virtual void Report( int iRet) = 0;
      };
      
      
      class CMain :
          public CWorkFlow
      {
      public:
          void Handle( int &a, int &b ) 
           {
               a = a + b/2;
           }
      
          void Report( int iRet)
           {
               printf("iRet = %d\n", iRet);
           }
      };
      
      // application
      
      int main()
      {
           CMain main;
           main.Start();
      }


        • example2::一个简单的函数回调的例子(语言C#)
          using System;
          using System.Collections.Generic;
          using System.ComponentModel;
          using System.Text;
          using System.Windows.Forms;
          namespace CallBack
          {
              public partial class Form1 : Form
              {
                  public Form1()
                  {
                      InitializeComponent();
                      Center center = new Center();
                      center.receive(message);
                  }
                  public void message(string msg)
                  {
                      MessageBox.Show(msg);
                  }
              }
           
              public class Center
              {
                  public delegate void CallBackDelegate(string msg);
           
                  public void receive(CallBackDelegate callback)
                  {
                      callback("中心收到");
                  }
              }
          }

          从上面代码可以看出, 回调函数是把方法当做参数传递给另一个类,另一个类在接收后再返回给调用类,最后由调用类完成回调函数的具体实现。
          在代码上,回调函数的委托运用和普通委托最大的不同点是center类中receive方法的 参数类型是委托类,通过委托类实现与message方法的具体关联
          所以要想很好的掌握回调函数的技巧,还是必须先要理解委托的基本原理和概念。


      • 0
        点赞
      • 1
        收藏
        觉得还不错? 一键收藏
      • 0
        评论
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值