[转载]c#4.0——泛型委托的协变、逆变Demo

[转载]c#4.0——泛型委托的协变、逆变Demo – Roy Ming – 博客园.

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

在 .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. 运行结果
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏