Visual Studio 2010:泛型委托的协变、逆变Demo


在编程语言中,“协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型。“逆变”则是指能够使用派生程度更小的类型。在 .NET Framework 4 和 Visual Studio 2010 中,C# 和 Visual Basic 都支持在泛型接口和委托中使用协变和逆变,并允许隐式转换泛型类型参数。

  如果泛型接口或委托的泛型参数声明为协变或逆变,则将该泛型接口或委托称为“变体”。C# 和 Visual Basic 都允许您创建自己的变体接口和委托。在匹配方法签名和委托类型方面,非泛型委托也支持协变和逆变。这样,您不仅可以为委托指派具有匹配签名的方法,而且可以指派这样的方法:它们返回与委托类型指定的派生类型相比,派生程度更大的类型(协变),或者接受相比之下,派生程度更小的类型的参数(逆变)。

  实例

  首先定义一个接口IColor及两个派生类

  public interface IColor { }
  public class Red : IColor { }
  public class Blue : IColor { } 

  定义ColorDemo类用来写展示协变与逆变的逻辑

  public class ColorDemo{}

  编写具体实现

 public class ColorDemo
  {
    //协变委托
    private delegate T CovarianceDelegate<out T>();
    //逆变委托
    private delegate void ContravarianceDelegate<in T>(T color);
    private static string colorInfo;
    public void CoreMethod()
    {
      //协变
      CovarianceDelegate<IColor> a1 = ColorMethod;
      a1.Invoke();
      CovarianceDelegate<Red> a2 = RedMethod;
      a2.Invoke();
      a1 = a2;
      a1.Invoke();
      //逆变
      ContravarianceDelegate<Blue> b1 = BlueMethod;
      b1.Invoke(new Blue());
      ContravarianceDelegate<IColor> b2 = ColorMethod;
      b2.Invoke(new Red());
      b1 = b2;
      b1.Invoke(new Blue());
    }
    private void Invoke(dynamic invokeObj)
    {
      Console.WriteLine("invokeObj类型为:" + invokeObj.GetType().Name);
      invokeObj.Invoke();
    }
    private IColor ColorMethod()
    {
      colorInfo = "无色";
      Console.WriteLine(colorInfo);
      return null;
    }
    private void ColorMethod(IColor color)
    {
      colorInfo = "无色";
      Console.WriteLine(colorInfo);
    }
    private Red RedMethod()
    {
      colorInfo = "红色";
      Console.WriteLine(colorInfo);
      return new Red();
    }
    private void BlueMethod(Blue blue)
    {
      colorInfo = "蓝色";
      Console.WriteLine(colorInfo);
    }
  } 

  运行结果

   static void Main(string[] args)
    {
      ColorDemo colorDemo =new ColorDemo();
      colorDemo.CoreMethod();
      Console.ReadLine();
    }


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3