zoukankan      html  css  js  c++  java
  • c#4.0——泛型委托的协变、逆变

    在编程语言中,“协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。“逆变”则是指能够使用派生程度更小的类型。

    在 .NET Framework 4 和 Visual Studio 2010 中,C# 和 Visual Basic 都支持在泛型接口和委托中使用协变和逆变,并允许隐式转换泛型类型参数。

    如果泛型接口或委托的泛型参数声明为协变或逆变,则将该泛型接口或委托称为“变体”。C# 和 Visual Basic 都允许您创建自己的变体接口和委托。

    在匹配方法签名和委托类型方面,非泛型委托也支持协变和逆变。这样,您不仅可以为委托指派具有匹配签名的方法,而且可以指派这样的方法:它们返回与委托类型指定的派生类型相比,派生程度更大的类型(协变),或者接受相比之下,派生程度更小的类型的参数(逆变)。

    实例

    1. 首先定义一个接口IColor及两个派生类
      public interface IColor { }

      public class Red : IColor { }

      public class Blue : IColor { } 
    2. 定义ColorDemo类用来写展示协变与逆变的逻辑
       
        public class ColorDemo{}
    3. 编写具体实现
       
        public class ColorDemo
      {
      //协变委托
      private delegate void CovarianceDelegate<out T>();
      //逆变委托
      private delegate void ContravarianceDelegate<in T>();

      private static string colorInfo;
      public void CoreMethod()
      {
      //协变
      CovarianceDelegate<IColor> a1 = ColorMethod;
      Invoke(a1);
      CovarianceDelegate
      <Red> a2= RedMethod;
      Invoke(a2);
      a1
      = a2;
      Invoke(a1);

      //逆变
      ContravarianceDelegate<Red> b1 = RedMethod;
      Invoke(b1);
      ContravarianceDelegate
      <IColor> b2 = BlueMethod;
      Invoke(b2);
      b1
      = b2;
      Invoke(b1);

      }

      private void Invoke(dynamic invokeObj)
      {
      Console.WriteLine(
      "invokeObj类型为:" + invokeObj.GetType().Name);
      invokeObj.Invoke();
      }

      public void RedMethod()
      {
      colorInfo
      = "我现在是红色";
      Console.WriteLine(colorInfo);
      }

      public void BlueMethod()
      {
      colorInfo
      = "我现在是蓝色";
      Console.WriteLine(colorInfo);
      }

      public void ColorMethod()
      {
      colorInfo
      = "我现在是无色";
      Console.WriteLine(colorInfo);
      }
      }
       
    4. 运行结果
       
  • 相关阅读:
    从下拉菜单设计细节看Amazon对用户体验的把握
    单行省略号纯css解决方案
    2013年度最新整理45个div+css兼容性问题与解决方案
    20个非常绚丽的 CSS3 特性应用演示
    分享30个最佳 jQuery Lightbox 效果插件【只收藏经典】
    如何让网站被快速收录?
    About FAR HTML
    前端工具
    Web设计师必备的10款最佳排版工具
    清除浮动解决方案
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1762397.html
Copyright © 2011-2022 走看看