[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#作为静态语言,它需要编译以后运 ...
随机推荐
- centos7普通用户拥有root权限并登录执行脚本
1.useradd test 2.passwd test 3.usermod -s 脚本绝对路径 test 4.vi /etc/passwd修改test用户的uid和gid为0
- Java 接口内容小结
Java接口学习:https://www.cnblogs.com/mlllily/p/14923837.html 小结内容: 在Java9+版本中,接口内容可以有常量.抽象方法.默认方法.静态方法.私 ...
- echarts——横向柱状堆叠图
var data = { data: [[320], [120], [220], [150]], legend: ['华为', '中兴', '烽火', '瑞斯'], } var option; var ...
- python学习●错误点●expected an indented block
报错:expected an indented block 翻译:缩进错误 因为python判断句无{},所以要缩进空格代表优先级.
- idea集成maven插件 使用骨架创建maven的java工具 不使用骨架创建maven的java工程
idea集成maven插件 使用骨架创建maven的java工具 new-->FIle-->Model 选择Maven对勾选上要不不能使用骨架 找到这个,选上下一步 Finish即可 ...
- 045_List view button
http://www.interactiveties.com/b_execute_javascript_button.php https://developer.salesforce.com/foru ...
- Windows MFC HTTP GET请求 函数流程
Windows MFC HTTP GET请求 函数流程 1 CString m_strHttpUrl(_T("http://10.200.80.86:8090/course/upload&q ...
- com.alibaba.fastjson.JSONObject cannot be cast to xxx
今天在使用json格式的数据进行转化的时候遇到了这个问题,故此记录下来. 通常我们使用JSON把数据转成实体的方法是这样的 List<DataModel> dataModels= (Lis ...
- nginx服务器有什么作用?什么叫反向代理?为什么要使用反向代理?
1 背景介绍 1.1 Nginx是什么? Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.其特点是占有内存少,并发能力强,事实上nginx的并发能力确 ...
- Mysql学习:1、mysql安装及配置及连接Navicat
1.下载地址: https://dev.mysql.com/downloads/windows/installer/8.0.html 2.安装流程: a.选自定义安装:custom. b. 在下一步的 ...