C#接口回调的实现方式的总结(一)

C#接口回调的实现方式的总结(一)

一、接口回调中接口扮演的角色

在所有面向对象编程的语言中实现对象与对象之间的消息传递的机制其背后基本的思路逻辑基本是一致的。

实现对象与对象之间的消息传递,最为简单粗暴的方式就是直接相互调用,

即A对象调用B对象时通过B对象的方法其传值,B对象处理完之后,将需要传递给A对象的数据通过调用A对象的方法向其传递数据。

但这种方式存在很大的弊端:1、A对象和B对象形成了相互依赖的“夫妻”关系,你中有我,我中有你。这种捆绑关系一旦建立,A就离不开B,B也离不开A。

                                               2、增加了代码维护的困难,修改A可能会导致B错误,修改B也可能引发A异常。

在编程中,类(对象)间的数据传递是无法回避的,有没有办法让A类(对象)和B类(对象)定义时相互独立,在运行时再建立相互关联关系?

而且在运行时,A类(对象)或B类(对象)除了相互调用外还可以和其他的类和对象建立关系?这就是通常我们所描述的解耦

这就好比,你要是“单身”,你和任何人处对象都是可以的,但如果是结了婚,这事就不行了,原来“解耦”也可理解成“解偶”,呵呵!

基于接口的回调就很好的实现和解决了这一问题。

接口:是一种数据类型,从形式上可以理解为构建虚方法的集合的一种数据类型,只能被继承和实现后才具备实际功能和意义。

正是接口这种方法定义和实现分离的特性,让其具备了让两个运行时存在关系的类,在定义时完全独立,实现了类的解耦。

二、接口回调必要的基础知识

1、关于继承

一个类只能继承一个类,但可以继承多个接口

2、关于类型转换

同一“血亲“类型之间可以相互转换,子类转父类不需要强制转换,而父类转换为子类需要强制转换,也就是说可以隐式和显示的将接口的子类转换为接口类型。

 class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            //同一“血亲”类型之间可以相互转换
            MyInterface myinterface = p;//子类转父类可以隐式转换也可以显示转换
            p = (Person)myinterface;//父类转子类必须显示转换
        }
    }
    interface MyInterface
    {
        void MyMethod();

    }
    class Person : MyInterface
    {
        public void MyMethod()
        {
            throw new NotImplementedException();
        }
    }

三、C#中接口回调的两种实现方式

在C#中使用事件机制以及dialog等方式替代接口回调,其实更为简单方便,但作为一个开发者还是需要对接口回调有深入的了解,毕竟事件委托是C#特有的东西,在几门开发语言见切换时对这些差别的深入了解会对一个开发者有极大的帮助。

为了更好的说明这个问题我们设定了一个简单的场景

 

 

两个窗体:MainFrm和CallFrm,MainFrm中的文本框为只读状态,点击输入按钮,弹出CallFrm,在CallFrm的文本框输入内容,单击确定按钮,将输入内容显示在MainFrm的文本框中,CallFrm关闭。

1、方式一:直接继承实现接口方式

MainFrm:继承接口;实现接口方法(接口回调方法)

CallFrm:定义内部接口,在点击 确定按钮时调用接口方法

具体代码如下:

public partial class MainFrm : Form, OnListener
    {
        public MainFrm()
        {
            InitializeComponent();
        }

        public void CallBackString(string s)//实现接口
        {
            richTextBox1.Text=s;
        }

        private void btnInput_Click(object sender, EventArgs e)
        {
            CallFrm f = new CallFrm(this);//j将本窗体作为参数传递给CallFrm构造函数
            f.Show();
        }
    }
 public partial class CallFrm : Form
    {//1、定义一个Form类型变量,用于接收是哪个窗体在调用本窗体
        private Form F;
        public CallFrm()
        {
            InitializeComponent();
        }
        //2、自定义一个构造函数,能接收调用本窗体的窗体变量
        public CallFrm(Form f)
        {
            InitializeComponent();
            this.F = f;//接收构造函数传递的窗体
        }
        //3、定义一个接口
        public interface OnListener {
            void CallBackString(string s);//在接口中定义一个回传字符的方法
        }
         private void btnOK_Click(object sender, EventArgs e)
        {
            if ((OnListener)F!=null)
            {
             ((OnListener)F).CallBackString(richTextBox1.Text);//将传进来的F强制转换为接口类型,并调用接口的CallBackString方法
            }            
            this.Close();
        }
    }

未完待续。。。。。。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值