zoukankan      html  css  js  c++  java
  • 委托中的协变和逆变

    将方法签名与委托类型匹配时,协变和逆变为您提供了一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。

    示例 1(协变)
     本示例演示如何将委托与具有返回类型的方法一起使用,这些返回类型派生自委托签名中的返回类型。由 SecondHandler 返回的数据类型是 Dogs类型,它是由委托中定义的 Mammals 类型派生的。
    class Mammals
    {
    }
    
    class Dogs : Mammals
    {
    }
    
    class Program
    {
        //定义委托
        public delegate Mammals HandlerMethod();
    
        public static Mammals FirstHandler()
        {
            return null;
        }
    
        public static Dogs SecondHandler()
        {
            return null;
        }
    
        static void Main()
        {
            HandlerMethod handler1 = FirstHandler;
    HandlerMethod handler2 = SecondHandler; } }
     
      本示例演示如何将委托与具有某个类型的参数的方法一起使用,这些参数是委托签名参数类型的基类型。通过逆变,以前必须使用若干个不同处理程序的地方现在只要使用一个事件处理程序即可
。如,现在可以创建一个接收 EventArgs 输入参数的事件处理程序,然后,可以将该处理程序与发送 MouseEventArgs 类型(作为参数)的 Button.MouseClick 事件一起使用,也可以将该处理程序与发送 KeyEventArgs 参数的 TextBox.KeyDown 事件一起使用。
     
    System.DateTime lastActivity;
    public Form1()
    {
        InitializeComponent();
    
        lastActivity = new System.DateTime();
        this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
        this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs
    
    }
    
    // Event hander for any event with an EventArgs or
    // derived class in the second parameter
    private void MultiHandler(object sender, System.EventArgs e)
    {
        lastActivity = System.DateTime.Now;
    }
  • 相关阅读:
    Kafka副本管理—— 为何去掉replica.lag.max.messages参数
    Kafka0.8.2.1删除topic逻辑
    【原创】如何确定Kafka的分区数、key和consumer线程数
    【原创】Kafka console consumer源代码分析(二)
    QGIS源码解析和二次开发
    点云数据中的三维信息提取pcl
    Halcon10.0 + VS2010
    Halcon链接库
    python调用Opencv库和dlib库
    cvtColor
  • 原文地址:https://www.cnblogs.com/weicanpeng/p/8072963.html
Copyright © 2011-2022 走看看