[C#]协变Covariance案例
协变参考代码1:
using System;
using System.Collections.Generic;
using System.Linq; namespace CovarianceSoOnDemo2
{
public class Pet
{
protected bool _bPutOn;
protected string _name;
public Pet(string name)
{
_name = name;
}
public void PutOn()
{
_bPutOn = true;
}
public void ShowMe()
{
string strPutOn = _bPutOn ? "穿衣的" : "";
Console.WriteLine(_name + ":"+strPutOn+"小可爱");
}
}
public class Cat : Pet
{ public Cat(string name) : base(name)
{ }
public void CatchMouse()
{
Console.WriteLine(_name + ":我会抓老鼠");
}
} public interface IIndex<out T>
{
T this[int index] { get; }
int Count { get; }
} public class CatCollection : IIndex<Cat>
{
private Cat[] _data;
public CatCollection(Cat[] data)
{
_data = data;
}
public Cat this[int index]
{
get
{
if (index < 0 || index > _data.Length)
throw new ArgumentOutOfRangeException("index");
return _data[index];
}
}
public int Count
{
get
{
return _data.Length;
}
}
}
class Program
{
static void Main(string[] args)
{
Cat[] catArr = new Cat[3] {
new Cat("傻猫1"),
new Cat("傻猫2"),
new Cat("傻猫3")
};
IIndex<Cat> cats = new CatCollection(catArr);
IIndex<Pet> pets = cats;
for(int i=0;i<pets.Count;i++)
{
pets[i].ShowMe();
}
for (int i = 0; i < pets.Count; i++)
{
pets[i].PutOn();
}
for (int i = 0; i < pets.Count; i++)
{
pets[i].ShowMe();
((Cat)pets[i]).CatchMouse();
}
}
}
}
协变参考代码2:
using System; namespace CovarianceSoOnDemo
{
public class Shape
{
public double Width { set; get; }
public double Height { set; get; }
public override string ToString()
{
return string.Format("Width:{0},Height:{1}", Width, Height);
}
}
public class Rectangle : Shape { }
public interface IIndex<out T>
{
T this[int index] { get; }
int Count { get; }
}
public class RectangleCollection : IIndex<Rectangle>
{
private Rectangle[] data = new Rectangle[3]
{
new Rectangle{Height=2,Width=5},
new Rectangle{Height=3,Width=7},
new Rectangle{Height=4,Width=2.9}
};
public Rectangle this[int index]
{
get
{
if (index < 0 || index > data.Length)
throw new ArgumentOutOfRangeException("index");
return data[index];
}
}
public static RectangleCollection GetRectangles()
{
return new RectangleCollection();
}
public int Count
{
get
{
return data.Length;
}
}
}
class Program
{
static void Main(string[] args)
{ IIndex<Rectangle> rectangles = RectangleCollection.GetRectangles();
//IIndex<Rectangle> rectangles = new RectangleCollection();
IIndex<Shape> shapes = rectangles;
for (int i = 0; i < shapes.Count; i++)
{
Console.WriteLine(shapes[i]);
}
}
}
}
[C#]协变Covariance案例的更多相关文章
- C# 逆变(Contravariance)/协变(Covariance) - 个人的理解
逆变(Contravariance)/协变(Covariance) 1. 基本概念 官方: 协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始 ...
- C#中的协变(Covariance)和逆变(Contravariance)
摘要 ● 协变和逆变的定义是什么?给我们带来了什么便利?如何应用? ● 对于可变的泛型接口,为什么要区分成协变的和逆变的两种?只要一种不是更方便吗? ● 为什么还有不可变的泛型接口,为什么有的泛型接口 ...
- 协变(covariance),逆变(contravariance)与不变(invariance)
协变,逆变与不变 能在使用父类型的场景中改用子类型的被称为协变. 能在使用子类型的场景中改用父类型的被称为逆变. 不能做到以上两点的被称为不变. 以上的场景通常包括数组,继承和泛型. 协变逆变与泛型( ...
- [改善Java代码]警惕泛型是不能协变和逆变的
什么叫做协变(covariance)和逆变(contravariance)? 在变成语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数,泛型,返回值)替换或交换的特性,简单的说,协变是 ...
- c#4.0新特性之协变与逆变
1.C#3.0以前的协变与逆变 如果你是第一次听说这个两个词,别担心,他们其实很常见.C#4.0中的协变与逆变[1](Covariance and contravariance)有了进一步的完善,主要 ...
- C# - 协变、逆变 看完这篇就懂了
1. 基本概念 官方:协变和逆变都是术语,前者指能够使用比原始指定的派生类型的派生程度更大(更具体的)的类型,后者指能够使用比原始指定的派生类型的派生程度更小(不太具体的)的类型.[MSDN] 公式: ...
- C#-弄懂泛型和协变、逆变
脑图概览 泛型声明和使用 协变和逆变 <C#权威指南>上在委托篇中这样定义: 协变:委托方法的返回值类型直接或者间接地继承自委托前面的返回值类型; 逆变:委托签名中的参数类型继承自委托方法 ...
- Java中的协变与逆变
Java作为面向对象的典型语言,相比于C++而言,对类的继承和派生有着更简洁的设计(比如单根继承). 在继承派生的过程中,是符合Liskov替换原则(LSP)的.LSP总结起来,就一句话: 所有引用基 ...
- 了解C#的协变和逆变
前言 在引用类型系统时,协变.逆变和不变性具有如下定义. 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类. Covariance 使你能够使用比原始指定的类型派生程度更大的类 ...
- C#的变迁史 - C# 4.0篇
C# 4.0 (.NET 4.0, VS2010) 第四代C#借鉴了动态语言的特性,搞出了动态语言运行时,真的是全面向“高大上”靠齐啊. 1. DLR动态语言运行时 C#作为静态语言,它需要编译以后运 ...
随机推荐
- 制作docker php5.6的镜像
docker pull centos Docker run -it --name="centos-test" centos yum install wget # 报错在后面有处理 ...
- redis的持久化方案RDB和AOF
RDB:快照形式,定期把内存中当前时刻的数据保存到磁盘.Redis默认支持的持久化方案.速度快但是服务器断电的时候会丢失部分数据 AOF形式:append only file.把所有对redis数据库 ...
- 原创:USB HID读卡器数据解析(R321-13.56MHZ读卡器)
1.工具准备 USB 监视软件:Device Monitoring Studio7.25 PC端软件:单片机多功能调试助手 2.发送数据包 接收数据包 3.数据分析 usb hid(pc软件)发送帧( ...
- SPI接口(续一)
SPI接口共涉及到11个寄存器,下面就来对它们进行具体分析. 先来看SPI配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40058000(SPI0),0x4005C000(SPI1). (1 ...
- 维纳攻击 wiener attack
维纳攻击 wiener attack 目录 维纳攻击 wiener attack 攻击条件 使用原理 十三届全国大学生网络安全竞赛 bd 分析 解答 [羊城杯 2020]rrrrrsa (wiener ...
- Word07 评审会会议秩序册office真题
1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...
- mysql主从备份双机热备实现方法
1.环境准备 主服务器(master):192.168.1.1 从服务器(slave):192.168.1.2 要求主从服务器mysql版本相同且大于3.23 2.主服务器 2.1创建同步用户 cre ...
- 常用的accept 属性值
*.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video *.ac3 audio/ac3 AC3 Audio *.asf allpication/vnd.ms-as ...
- vue-drag-resize + html2canvas合成图片并下载
https://blog.csdn.net/weixin_43923659/article/details/114701048
- 关于JavaScript的一些用法
关于JavaScript的死链设置问题<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> ...