第七讲 委托和事件原理

 
主题:委托delegate和事件Event
 
注解:什么是委托,委托就是给符合一定类型特征的(参数和返回值)的行为提供统一的访问,这个统一的访问,无视类,无视继承,
委托使用步骤:
                     1:)声明委托 (为行为定义统一的规则(参数和返回值),这个就相当于我们在程序里面创建了一个数据类型,只是这个类型是对方法的)
                          如:public delegate void SendMsgDelegate(string msg);
                     2:) 定义委托(初始化委托,因为委托是引用类型,和object是一样的,上面只是声明现在是,现在是定义上面类型的委托的声明)
                          如:private event SendMsgDelegate aSendMsgDelegate = null;
 
                    3:)建立和被委托类的关联关系  
                         如:aSendMsgDelegate += bForm.ReceiveMsg;
 
                    4:)执行委托
                        如:aSendMsgDelegate(this.txtSend.Text.Trim());
 
委托有一个比较重要的特征就是,多次委托,一次执行,而且执行顺序就是委托的顺序,
 
注意委托是一个类型,而且是一个引用类型,它和list,arry一样,我们声明了委托以后,还要创建委托,
 
 
1. 引入:delegate(代理,代表...) 就是表示双方建立关系的时候,有一个“中介”参与,这个中介能够更好的促进双方的沟通。
 
  现实中,比如各种中介组织(房屋),代理组织(各种商标等代理注册公司...\网站备案)
 
  现实中的这些中介组织主要是为了更好的保证双方及时有效的“沟通”。
 
  在程序中,有的时候,我们可能也会无法直接从一个对象的行为,到另一个对象的行为!
 
  调用一个对象,对象名.操作名(方法名)完成的。直接的交互方式。如果两个对象之间交互,没问题的。
 
  Q:如果一个对象想调用另一个对象的行为,但是这个对象并不是固定的,这时候我们无法直接使用这个对象!
 
       做法:将调用者,和被调用者分离!解耦!
 
       A--->B   A 可以调用B对象的所能使用的各种行为。 如果 A调用的这种行为并不是固定到B,这时候,可以使用委托。
 
       逆向思考,如果B反过来想调用A?直接是无法做到的,因为对象之间消息传递逻辑,是不允许你直接随便的逆向传递!
 
       这时候,同样可以使用委托。
 
 
2. 委托具体委托的什么?是对象的行为!
 
3. 概念:委托可以表示一种符合某种类型的方法!(委托就是方法的指针)委托本身就是一种引用类型!
 
    委托所代表的这个方法有什么要求呢?委托其实是规定一个方法的“原型”,原型包括:方法参数个数和类型、以及返回值。
 
    只要符合方法原型的任何方法,都可以被委托变量引用(代表)。
 
    
4.定义:deletgate关键字,委托一般定义到类的外面,但是对于后面我们学习多线程以及Lambda表达式的时候,经常会看到
 
  委托定义到类的内部,这个也是正常的。通常内部定义的这些委托,都是我们学习的基础。到后面,我们一般都不在直接使用
 
  内部委托。
 
5. 应用:
 
    应用的角度:【1】是为了扩展行为  【2】为了达到关联的目的
 
6.委托在多窗体(多对象之间通信:
   A对象创建B对象,A 可以调用B对象的成员。反之不行。但是我使用委托可以做到B逆向调用A的成员。
 
 
应用当中,大家可能会搞乱一个问题,那就是委托变量应该定义到哪里?
 
我想求你办事!但是我和你不太熟悉!怎么办?我找你要好的一个朋友,这个朋友跟我关系也好!我委托你的一个朋友。
 
谁委托,委托就定义到谁的里面!(谁发消息,谁定义委托,谁接收消息,谁定义方法)
 
A -----》B  (可以直接调用)
 
 
A(MainForm)主界面
 
A-->B窗体(课程管理)--->C
 
A-->C窗体(添加课程)
 
***********************************************************************************************************
 
事件:其实就是把委托做了一层包装!
 
win10 家庭版(做了很多功能的取消,有的可以自己开放,但是大部分你都操作不了)
 
winServer服务器版(开放很多端口,很多功能)
 
 
///双向委托测试代码
namespace ConsoleApplication11
{
    //定义委托 创建一个有统一返回值和参数的行为类型
    public delegate void SendDelegate(string msg);
    class Program
    {
        static void Main(string[] args)
        {
            cla mydelegate = new cla();
            mydelegate.SendMsg("委托信息发送了");
            Console.Read();
        }
    }
    public class cla
    {
        /// <summary>
        /// 声明委托,也就是对象初始化
        /// </summary>
        public SendDelegate MyDelegate;
        public cla()
        {
            //这个是 cla里面的委托声明(初始化),然后吧clb里面的方法委托过来
            MyDelegate += clb.RegMsg; 
            //这个是clb里面的委托初始化,然后吧委托a的方法关联
            clb.MybDelegate += cla.Repl;
            //上面我们可以看到,委托的声明在各自的类里面,但是委托的关联,数据的关联,可以放到任意地方,
        }
        /// <summary>
        /// 发送的信息类
        /// </summary>
        public string Msg { get; set; }
        public void SendMsg(string msg)
        {
            //执行自己声明的委托
            MyDelegate(msg);
        }
        public static void Repl(string msg)
        {
            Console.WriteLine("我是B回复的数据:" + msg);
        }
    }
    public class clb
    {
        //委托的声明,
        public static SendDelegate MybDelegate;
        public static void RegMsg(string msg)
        {
            Console.WriteLine("我收到了信息:" + msg);
            //执行自己声明的委托,但是这个委托的关联(数据的初始化),在cla里面
            MybDelegate("我是委托返回的信息");
        }
    }
}
 
 
 
 
 
 
 
posted @ 2019-04-08 18:09  瀚海行舟  阅读(207)  评论(0编辑  收藏  举报