zoukankan      html  css  js  c++  java
  • 委托释疑(转)今天转了很多委托 本人也是真笨

            一个函数带有参数非常平常,但一个类带有一个方法的参数可能会觉得奇怪,这就是委托的特征。很多书籍都说委托就象C或C++的函数指针,说得不无道理,因为它允许在委托对象的内部封装方法的引用,也就是前面所说的带有一个方法的参数,这个方法参数有一定的规则,它可以是静态的,也可以是一个实例方法,这个方法的参数和返回类型必须和委托对象所带的相同。

             委托就像一个中间代理,通过引用这个委托对象,就可以调用被这个委托对象所引用的方法,也就是它所带的方法参数。可以调用它引用的方法,而不用管这个方法的哪个类的,因为已经通过这个委托对象去引用这个类的方法了,即我们调用这个方法是通过这个委托中间代理来实现的。有一点好处就是委托它是面向对象的,而且类型安全的。看以下代码:

    class 委托人
    {
     public string invokedmethod()  //注意此方法返回string,与委托对象相同,所要委托的事
     {
      Console.WriteLine("Hello"); 
     }
    }

    class  类

    {
    委托人 classobj = new 委托人();
    delegate string 被委托人();  //声明一个返回类型为string的委托对象
    被委托人 deleobj=new 被委托人(classobj.invokedmethod);//创建一个带有方法的委托对象

    deleobj();

    }

            委托通常与事件一起结合使用。事件是对用户动作的处理,当用户有某种动作的时候,通过委托对象来执行,因此,事件是通过委托来声明的。事件可以使用任何类型的委托,但有一点要注意,就是在使用组件时要遵循一些规则:事件使用的委托类型应有两个参数,一个是对象源,一个是e参数。对象源表示事件发生的源 ; e表示封装该事件的一些信息,这个e是从EventArgs类派生出来的。事件处理程序其实就同系统已定义的按钮点击事件,只不过这一次是由我们自己来定义而已。关于委托与事件的例子,参照http://blog.csdn.net/jabby12/archive/2004/08/02/58901.aspx


    Delegate简单示例
    //********************************************/
    /*       Delegate Sample
    /* 
    //*****************************************************************
    */


    using System;

    namespace EventTest
    {
     
    //事件类
     public class EventClass
     
    {
      
    public void display(object sender,System.EventArgs e)
      
    {
       Console.WriteLine(
    "This is the Event Class");
       Console.ReadLine();
      }

     }

     
    //调用类
     class InvokeClass
     
    {
      
    //声明代理对象,注意参数
       public delegate void delegateobj(object sender,System.EventArgs e);
      
    //声明事件对象 
      private event delegateobj obj;
      
    //声明要调用的事件类对象
      private EventClass ec;
      
      
    public InvokeClass()
      
    {
       ec
    =new EventClass();
       
    //添加事件对象到事件队列中,参数为要调用的事件
       this.obj+=new delegateobj(ec.display);
      }

      
    //调用delegate对象触发事件
      protected void OnObj(System.EventArgs e)
      
    {
       
    if(this.obj!=null)
       
    {
         obj(
    this,e);
       }

      }

      
    public void RaiseEvent()
      
    {
       EventArgs e
    =new EventArgs();
       OnObj(e);
      }

      
    static void Main(string[] args)
      
    {
       InvokeClass ic
    =new InvokeClass();
       Console.WriteLine(
    "Please input a string");
       
    string input=Console.ReadLine();
       
    if(input.Equals(""))
       
    {
        Console.WriteLine(
    "Sorry,you don't input anything");
       }

       
    else
       
    {
        
    //触发事件
        ic.RaiseEvent();
       }

      }

     }

    }

  • 相关阅读:
    第一周作业
    模拟赛3 题解
    模拟赛2 题解
    [HNOI2008]GT考试 题解
    NOI Online 提高组 题解
    模拟赛1 题解
    知识点拾遗
    [NOIp2012]疫情控制 题解
    [CEOI2002]Bugs Integrated, Inc. 题解
    [NOIp2017]宝藏 题解
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/676394.html
Copyright © 2011-2022 走看看