• 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. 运行结果
       
  • 相关阅读:
    数据结构第二篇——线性表的顺序存储
    数据结构第一篇——线性表的逻辑结构
    面向对象之工资管理系统
    #ifndef三件套与#pragma once
    i++与++i的区别
    struct与class的区别(分别在c和c++中)
    浅析数据结构
    K60
    更新整理本人所有博文中提供的代码与工具(Java,2013.08)
    [置顶] cocos2d实现CCLabelTTF真正字体描边效果
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1762397.html
Copyright © 2020-2023  润新知