zoukankan      html  css  js  c++  java
  • 委托

    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#引入委托机制后,使得方法声明和方法实现的分离,充分体现了面向对象的编程思想。

  • 相关阅读:
    1.RabbitMQ简介
    有这样一个需求 element +vue 实现显示的table 的表头添加一个添加图标, 并绑定一个点击事件,我查了好多资料, 终于找到table 表头的一个事件 :render-header 可以实现。
    原生的html js 做的文件上上传
    elment + vue 文件上传
    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
    mysql 数据库迁移 sql server (沃尔玛)
    quartz 浅谈 Scheduler
    quartz CronTrigger的cron表达式 详解:
    Linux中的一些常用命令
    类图中常用的六种关系
  • 原文地址:https://www.cnblogs.com/polly333/p/4498399.html
Copyright © 2011-2022 走看看