C#使用接口实现回调

金旭亮老师图书摘录


  通常情况下,我们创建一个对象,并马上直接去使用它的方法。然而,在有些情况下,希望能在某个场景出现后或条件满足时才调用此对

象的方法。回调就可以解决这个“延迟调用对象方法”的问题。这个被调用方法的对象称为回调对象。

实现回调的原理简介如下:

  首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象.控制器对象负责检查某个场景是否出现

或某个条件是否满足.当此场景出现或此条件满足时,自动调用回调对象的方法.

  以下为C#实现回调的一个小例子。


  using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建一个控制器对象,将提供给它的回调对象传入
            Controller obj = new Controller(new CallBack());
            //启动
            obj.Star();
        }
    }

    public interface IBack
    {
        void run();
    }

    public class CallBack : IBack
    {
        public void run()
        {
            //为了简洁这里只是显示下时间
            System.Console.WriteLine(DateTime.Now);
        }
    }

    public class Controller
    {
        public IBack CallBackObj = null;   //这里引用回调对象
        public Controller(IBack obj)
        {
            this.CallBackObj = obj;
        }
        public void Star()
        {
            Console.WriteLine("敲键盘任意键就显示当前的时间,直到按ESC退出....");
            while (Console.ReadKey(true).Key != ConsoleKey.Escape)
            {
                CallBackObj.run();
            }
        }
    }
}

     可以看到,当示例程序运行时,何时调用CallBack对象的run()方法是由用户决定的,用户每敲一个键,控制器对象就调用一次

CallBack的run()方法。这个示例中实现回凋的关键在于IBack接口的引入。
     如果不用IBack接口,而直接使用 CallBack对象,一样可以实现同样的效果,如下:

       public class Controller
    {
        public CallBack CallBackObj = null;   //回调对象方法的引用
        public Controller(CallBack obj)
        {
            this.CallBackObj = obj;
        }
        public void Star()
        {
            Console.WriteLine("敲键盘任意键就显示当前的时间,直到按ESC退出....");
            while (Console.ReadKey(true).Key != ConsoleKey.Escape)
            {
                CallBackObj.run();
            }
        }
    }
  
   但仔细思考,这样做的结果就使Controller类与CallBack对象绑定在一起,万一如果需要调用其他类型的对象,则必须修改Controller类

的代码。
   如果Controller类接收的是一个抽象的接口变量IBack,则任何实现了该接口的对象都可以被Controller类对象所回调,Controller类的代

码就再不用被修改,保证了代码对环境的适应性,无疑是一个很好的解决方案。


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值