[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#作为静态语言,它需要编译以后运 ...
随机推荐
- debian/ubuntu下安装nodejs npm
举例:在 /home 目录下 wget https://nodejs.org/dist/v16.17.1/node-v16.17.1-linux-x64.tar.xz nodejs官网下载地址,目前最 ...
- apk签名之后安装失败
Android Studio 3.0.1 很奇怪的一个现象,直接run的话可以成功,debug也可以,但是用签名打包之后,却安装失败,原来是打包的时候选错了.原来签名时,Signature Versi ...
- css代码中的2个类名连一起写是啥意思?
<div class="menu-btn closed"> <div class="menu-line"></div> &l ...
- JDBC之Driver和DriverMananger
JDBC之Driver和DriverMananger 目录 JDBC之Driver和DriverMananger Java和MySQL的关系 JDBC 演变过程 驱动加载入内存的过程 Oracle加载 ...
- ssh_remote_without_password
2 machines, 1 called client , 1 called server , server need static ip address. client connects serve ...
- 微信小程序云开发,快速生成短信验证码
使用微信小程序云函数实现注册短信验证码的管理,并不是一件分分钟的事,目前想要存储验证码只能放到数据库中,因为存储后才能和用户提交上来的验证码做比较. 管理验证码主要涉及到:生成.存储.校验.有效期管理 ...
- 48. Rotate Image via java
need to use scratch to find the pattern class Solution { public void rotate(int[][] matrix) { int n= ...
- python机器学习——PCA降维算法
背景与原理: PCA(主成分分析)是将一个数据的特征数量减少的同时尽可能保留最多信息的方法.所谓降维,就是在说对于一个$n$维数据集,其可以看做一个$n$维空间中的点集(或者向量集),而我们要把这个向 ...
- 浏览器输入URL发生了什么:DNS解析、TCP握手、HTTP缓存、重定向、服务器状态码、渲染引擎和JS引擎互斥、渲染过程、浏览器进程、网络进程、渲染进程
输入地址,浏览器查找域名的 IP 地址. 浏览器向 该 IP 地址的web 服务器发送一个 HTTP 请求, 在发送请求之前浏览器和服务器建立TCP的三次握手,判断是否是HTTP缓存, 如果是强制缓存 ...
- Java断言语句
断言语句在调试代码阶段非常有用,断言语句一般用于 程序不准备通过捕获异常来处理的错误,例如,当发生某个错误时,要求程序必须立即停止执行.在调试代码阶段让断言语句发挥作用,这样就可以发现一些致命的错 ...