zoukankan      html  css  js  c++  java
  • 理解委托

    委托是一种类型.委托像String,像Integer,像我们定义的Class一样,是一种类中.

    委托是一种引用方法的类型.与委托的签名(参数和返回值)匹配的方法都可以分配给该委托.方法可以是静态方法,也可以是实例方法.

    一旦为委托分配了方法,委托将与该方法具有相同的行为.委托方法的调用可以像其他方法一样,具有参数和返回值.

    使用委托,可以将多个方法绑定到同一个委托变量.当调用此变量时,可以依此调用所绑定的方法.

    注意:

    在方法重载的上下文中,方法的签名不包括返回值,但是在委托的上下文中,签名包括参数和返回值.

    委托的特点:

    1.委托类似于方法指针.

    2.委托允许将方法作为参数进行传递

    3.委托可用于方法回调.

    4.委托可以链接在一起.

    5.方法不必与委托签名完全相同

    6.可以将匿名函数作为参数传递.

    注意,我们在上面提到,与委托签名匹配的方法都可以分配给该委托,而不是说与委托签名相同的方法都可以分配给该委托. 

    对于第5个特点,我们来看:委托中的协变和逆变

    协变可以将委托与具有返回类型的方法一起使用,其中这些返回类型继承自委托的返回类型.

    协变允许方法具有的派生返回类型比委托中定义的更多.

    例:

    public class Anmail
    {    
        
    }
    
    public class Cat : Anmail
    {
        public static Cat GetCat()
        {
            HttpContext.Current.Response.Write("Get a cat!<br/>");
            return new Cat();
        }
    }
    public class Dog : Anmail
    {
        public static Dog GetDog()
        {
            HttpContext.Current.Response.Write("Get a dog!<br/>");
            return new Dog();
        }
    }
    
    public delegate Anmail GetAnmails();
    
    protected void Page_Load(object sender, EventArgs e)
    {
        GetAnmails get = new GetAnmails(Cat.GetCat);
        get += Dog.GetDog;
        get();
    }

    结果:

    image

    逆变可以将委托与具有某个类型的参数的方法一起使用.其中这些参数委托签名的基类型.

    逆变允许方法具有的派生参数类型比委托类型中的更少.例:

    public class Anmail
    {
        public string Name { get; set; }
    }
    
    public class Cat : Anmail
    {
    
    }
    public class Dog : Anmail
    {
    
    }
    
    public delegate void GetAnmails(Anmail an);
    
    someclass
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Cat c = new Cat() { Name = "Cat" };
            Dog g = new Dog() { Name = "Dog" };
    
            GetAnmails get = new GetAnmails(GetName);
            get(c);
            get(g);
        }
    
        public void GetName(Anmail an)
        {
            Response.Write(an.Name + "<br/>");
        }
    }

    结果:

    image

  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/loveYN/p/4509660.html
Copyright © 2011-2022 走看看