C# 协变与逆变

C# 专栏收录该内容
2 篇文章 0 订阅

“协变”->”和谐的变”->”很自然的变化”->string->object :协变。

“逆变”->”逆常的变”->”不正常的变化”->object->string 逆变。

协变

接口

/// <summary>
    /// 逆变
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IDisplay<in T>
    {
        void Show(T item);
    }
    /// <summary>
    /// 协变
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IIndex<out T>
    {
        T this[int index] { get; }
        int Count { get; }
    }
 public class Shape
    {
        public double Whidth { get; set; }
        public double Height { get; set; }

        public override string ToString()
        {
            return $"Whidti:{Whidth},Height:{Height}";
        }
    }

    public class Rectangle : Shape
    {


    }

协变
IIndex接口用RectangleCollection 类来实现

 public class RectangleCollection : IIndex<Rectangle>
    {
        private Rectangle[] data = new Rectangle[3]
        {
            new Rectangle{Height=2,Whidth=5},
            new Rectangle{ Height=3,Whidth=7},
            new Rectangle{ Height=4.5,Whidth=2.9}
        };

        private static RectangleCollection _coll;
        public static RectangleCollection GetRectangles() => _coll ?? (_coll = new RectangleCollection());
        public Rectangle this[int index] {

            get
            {
                if (index < 0 || index > data.Length)
                    throw new ArgumentOutOfRangeException("index");
                return data[index];
            }
        }

        public int Count => data.Length;
    }

控制台使用

//协变
            IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles();
            IIndex<Shape> shape = rectangles;
            for (int i = 0; i < shape.Count; i++)
            {
                Console.WriteLine(shape[i]);
            }

逆变

 public class ShapeDisplay : IDisplay<Shape>
    {
        public void Show(Shape item)
        {
            Console.WriteLine($"{item.GetType().Name} Width:{item.Whidth},Height:{item.Height}");
        }
    }

控制台使用

  //逆变
            IDisplay<Shape> shapeDisplay = new ShapeDisplay();
            IDisplay<Rectangle> rectangleDisplay = shapeDisplay;
            rectangleDisplay.Show(rectangles[0]);

区别

在这里插入图片描述
协变: 将 rectangle 继承 Shape 的数据装换为 Shape 他们的接口都使用IIndex
逆变:将Shape 转为 rectangle 他们的接口都使用IDisplay

来自C# 高级编程

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值