美文网首页
C#实现接口回调

C#实现接口回调

作者: 没伞的小孩 | 来源:发表于2018-06-28 17:48 被阅读0次

    1.通常情况下,我们创建一个对象,并马上直接去使用它的方法。然而,在有些情况下,希望能在某个场景出现后或条件满足时才调用此对象的方法。回调就可以解决这个“延迟调用对象方法”的问题。这个被调用方法的对象称为回调对象

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

    首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象.控制器对象负责检查某个场景是否出现或某个条件是否满足.当此场景出现或此条件满足时,自动调用回调对象的方法.
    以下为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传给当前类中的引用的对象。
                 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类的代码就再不用被修改,保证了代码对环境的适应性,无疑是一个很好的解决方案。

    相关文章

      网友评论

          本文标题:C#实现接口回调

          本文链接:https://www.haomeiwen.com/subject/muqnyftx.html