C#实现接口回调

原创 2016年08月31日 12:37:07

通常情况下,我们创建一个对象,并马上直接去使用它的方法。然而,在有些情况下,希望能在某个场景出现后或条件满足时才调用此对象的方法。回调就可以解决这个“延迟调用对象方法”的问题。这个被调用方法的对象称为回调对象。
实现回调的原理简介如下:
首先创建一个回调对象,然后再创建一个控制器对象,将回调对象需要被调用的方法告诉控制器对象.控制器对象负责检查某个场景是否出现或某个条件是否满足.当此场景出现或此条件满足时,自动调用回调对象的方法.
以下为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类的代码就再不用被修改,保证了代码对环境的适应性,无疑是一个很好的解决方案。

版权声明:欢迎转载,转载请注明原博客链接:http://blog.csdn.net/u013108312 和本文章的链接。谢谢合作。作者:CircleGood 举报

相关文章推荐

c#调用c++dll接口及回调函数

在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家: VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, st...

C#回调接口的例子

using System;using System.Collections;namespace Practice{ public interface ISwitch { vo...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

[From Network]C#使用接口实现回调

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

C#实现接口回调

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

[From Network]抽象类和接口(C#)的区别(2)

抽象类(abstract class):abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。抽象类与非抽象类在以下方面是不同的: 抽象类不能直接实例化,并且对抽象类使用 new ...

C#使用接口实现回调

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

C#跨窗体调用控件(委托回调函数)

问题: 有两个窗体,FORM1(含一个label控件,一个名为显示form2的button控件)和FORM2(含一个button控件)。启动时,FORM1中点击button控件显示form2使FORM...

C# interface学习经验浅谈

C# interface学习是我们学习C#语言的一个重点,那么如何掌握好C# interface的使用规则呢?那么本文就向你介绍一些C# interface学习的经验和体会。 AD:51CTO开...

C#中的interface

Interfaces (C# Programming Guide) Interfaces are defined using the interface keyword. For e...

C#中的interface一般在什么时候用

来源 http://bbs.csdn.net/topics/80027103
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)