/*--------------------CSS部分-------------------*/ /*--------------------JS部分-------------------*/

委托

1. 委托的来源

在c++中有回掉函数,那么在c#也就对应有委托。委托正如字面意思,就是代理的意思。比如律师,原告将一件事情委托给律师办理。但是对于律师来讲,每天会有案件接手,我就将他们分类,比如民事案件,然后就民事案件相关法律注意发给原告,这样就放便很多。回归主题,在程序中例如主窗体获取一条信息,然后需要发给一组的控件,然后控件对这些信息进行处理,处理过程有的一样,但是控件名称不一样,这样就可将处理过程设置一个委托,统一处理,委托传入参数为信息。在主窗体中然后针对每个控件初始化一个对象,并将响应的函数注册上。
委托的实例有点类似函数指针,如果只是单纯调用委托实例,也就等同于调用函数。委托真正利用之处是作为参数传入其中,然后在这函数中对这个委托参数进行统一处理。

2 分析过程

1、分析程序中对信息Meg的不同处理和发布,讲这些不同的处理过程写成一组函数 FuncHandle1(T para1,T para2),FuncHandle2(T Para,T para);
2、根据需要定义一个委托delegateFunc指向FuncHandle,格式当然和FuncHandle相同。
3、在程序中找到Meg的获取以及FuncHandle的调用,讲这个对函数调用过程再封装成HangleDelegate(delegateFunc delegateinstance)。此函数封装了信息的获取,以及delegateInstance调用(传参数para1,para2).
4、回到主程序中,初始化delegateFunc多个实例,指向不同FuncHandle。
5 、讲不同的delegateFunc实例当做参数传入到HandleDelegate中。

3、程序实例

程序实现的功能是:在下方文本框输入文字,勾选“书写到”组合框中的“文本区1”或“文本区2”复选框后点击“开始”按钮,程序会自动将文本框中的文字”抄写“到对应的文本区中去。程序界面如下:
这里写图片描述
代码如下:

namespace TestFrmDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       //2.定义一个委托
        private delegate void DelegateFunc(char ch);
        //3、实例化委托
        DelegateFunc delegateInstance;
        // 构造一组委托指向的函数
        private void FuncHandle1(char ch)
        {
            textBox1.AppendText(ch.ToString());
        }

        private void FuncHandle2(char ch)
        {
            textBox2.AppendText(ch.ToString());
        }

        //讲委托作为参数传入其中
        private void HandleDelegate(DelegateFunc Instancedele)
        {
            string data = textBox3.Text;
            for (int i = 0; i < data.Length;i++ )
            {
                Instancedele(data[i]);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (checkBox1.Checked == true)
            {
                this.textBox1.Clear();
                this.textBox1.Refresh();
                //实例化委托。这里是对信息的处理
                delegateInstance = new DelegateFunc(FuncHandle1);
                //委托作为参数,对信息处理后的事情,然后回到主程序
                HandleDelegate(delegateInstance);
                this.textBox3.Focus();
                this.textBox3.SelectAll();
            }
            if (checkBox2.Checked == true)
            {
                this.textBox2.Clear();
                this.textBox2.Refresh();
                delegateInstance = new DelegateFunc(FuncHandle2);
                HandleDelegate(delegateInstance);
                this.textBox3.Focus();
                this.textBox3.SelectAll();
            }
        }
    }
}
View Code

 

4 小结

如果要实现一个写入的文本框不止2个,而是好几十个甚至更多,那么不久要写出同样多数量的用于写入文本区的方法了吗?这样就不得不写重复的代码,导致代码的可读性就差,这样写代码也就是面向过程的一个编程方式,因为函数是对操作过程的一个封装,要解决这个问题,自然我们就想到面向对象 编程,此时我们就会想到把变化的部分封装起来,然后再把封装的对象作为一个对象传递给方法的参数的(这个思想也是一种设计模式——策略模式。C#引入委托机制后,使得方法声明和方法实现的分离,充分体现了面向对象的编程思想。

posted @ 2015-03-05 15:31  bldong  阅读(287)  评论(0编辑  收藏  举报