[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#作为静态语言,它需要编译以后运 ...
随机推荐
- dockerfile实践学习
一.dockerfile简介 镜像是分层存储的,每一层在前一层的基础上进行修改. 容器也是分层存储,已经向为基础层,在其他基础上加一层作为容器运行的存储层. 创建镜像的另种两种方法 手动修改容器内容, ...
- python 迁移虚拟环境
1.在源环境中获取包列表(新建文件夹whls) #cd 虚拟环境目录下的\scripts,cmd acitivate # 下载清单到requirements.txt,切换到whls目录 pip fre ...
- Xpath 常用语法展示
非标准代码处理 from lxml import etree #导入lxml 中erree模块 parser = etree.HTMLParser(encoding="utf-8" ...
- 在datagridview中首列添加复选框
//为dgv增加复选框列 DataGridViewCheckBoxColumn checkbox = new DataGridViewCheckBoxColumn(); //列显示名称 checkbo ...
- 简单的python线程池实现线程安全demo
from concurrent.futures import ThreadPoolExecutor import threading import time import sys sys.path.a ...
- 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组
var threeSum = function(nums) {let ans = [];const len = nums.length;if(nums == null || len < 3) r ...
- maven(web)项目,不自动出现overlays的上级web项目
不自动出现overlays目录,如下: 上面选择一项, 最后部署至tomcat或是其他中间件上面,overlays的上关联的上级项目就会出现
- 2022-04-12内部群每日三题-清辉PMP
1.一个项目的成本绩效指数(CPI)为1.2,且关键路径上的一个可交付成果落后于进度. 如果项目经理将项目回正轨,项目会发生什么情况? A.活动将并行执行 B.范围将被修改 C.成本和风险将会增加 D ...
- vue中key
使用key维护列表的状态 当列表的数据变化时,默认情况下,vue尽可能的服用已存在的DOM元素,从而提升渲染的性能.但这种默认的性能优化策略,会导致由状态的列表无法被正确更新. key的使用注意事项: ...
- The operation was rejected by your operating system.
我在新项目开启的时候使用npm install来初始化前端代码的开发环境 但是遇到一个问题,一直报: The operation was rejected by your operating syst ...