[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#作为静态语言,它需要编译以后运 ...
随机推荐
- ubuntu iptables 做为路由转发
实现功能,本地服务器的号段的192.168.8.0/24,而做为路由器的机器有2个ip,192.168.8.x和另一个ip,而另一个ip可以访问 192.168.2.0/24号段, 为了让其它192. ...
- viewport适配解决方案
viewport的单位vw.vh vw.vh将viewport分成了一百份.vw即 viewport width vh即viewport height 1vw等于视图单位的1%的宽度 1vh等于视图单 ...
- css 多行隐藏
overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box- ...
- php基础教程(一)
语法: PHP的语法很简单 --直接看代码: <?php /*代码部分*/ ?> 这就是PHP代码的声明方式. 注:<? ?> 等这中写法也可以写,但是不建议这么写. 标记语句 ...
- Selector 如何关联 channel,以及需要注意的点
一.创建 selector Selector selector = Selector.open(); 1.一个 selector 可以管理多个 channel . 二.channel 如何注册到 se ...
- 前端循环及跳出for循环
前端循环语句与方法 while循环 语法 1.初始化变量 2.while(条件表达式){逻辑代码循环体} 执行过程: 1.执行初始化变量 2.变量是否满足条件表达式 3.满足执行循环体 4.条件不满足 ...
- 循环for in 和for of
for in 和for of都是前端循环工具 我平时用for in比较多一点 但是今天来看一下两者的区别 先声明一个对象和一个数组 分别使用for in和for of分别查看得到的结果 var arr ...
- IDEA给【类】和【方法】设置作者和日期等注释
https://blog.csdn.net/m0_61933976/article/details/127021176 一.在Java类的开头自动注释作者名字和日期等信息 这样以后只要我们创建一个类, ...
- 机器学习——常见的backbone
参考链接:https://www.zhihu.com/question/396811409/answer/1252521120 LeNet:5层轻量级网络,一般用来验证小型数据: AlexNet/VG ...
- mobx hook中的使用
class import { inject, observer } from "mobx-react"; // 需要使用mobx-react提供的Provider 包裹,需要使用的 ...