当前位置: 首页 > news >正文

C# 使用泛型协变性

在 C# 中处理多个类型的生产者时,可以使用泛型接口结合协变性。以下是一个示例,展示如何实现一个支持多个类型的生产者。

协变性

using System;
using System.Collections.Generic;public interface IProducer<out T>
{T Produce();
}public class FruitProducer : IProducer<Fruit>
{public Fruit Produce(){return new Fruit("Apple");}
}public class AppleProducer : IProducer<Apple>
{public Apple Produce(){return new Apple("Granny Smith");}
}public class OrangeProducer : IProducer<Orange>
{public Orange Produce(){return new Orange("Navel Orange");}
}public class Fruit
{public string Name { get; }public Fruit(string name){Name = name;}
}public class Apple : Fruit
{public Apple(string name) : base(name) { }
}public class Orange : Fruit
{public Orange(string name) : base(name) { }
}class Program
{static void Main(){List<IProducer<Fruit>> producers = new List<IProducer<Fruit>>(){new FruitProducer(),new AppleProducer(),new OrangeProducer()};foreach (var producer in producers){ProduceFruit(producer);}}static void ProduceFruit(IProducer<Fruit> producer){Fruit fruit = producer.Produce();Console.WriteLine($"Produced: {fruit.Name}");}
}

非协变性

using System;// 定义非协变的泛型接口
public interface IProducer<T>
{T Produce();
}// 实现生产者类
public class FruitProducer : IProducer<Fruit>
{public Fruit Produce(){return new Fruit("Apple");}
}public class AppleProducer : IProducer<Apple>
{public Apple Produce(){return new Apple("Granny Smith");}
}// 基类和子类
public class Fruit
{public string Name { get; }public Fruit(string name){Name = name;}
}public class Apple : Fruit
{public Apple(string name) : base(name) { }
}// 主程序
class Program
{static void Main(){// 创建生产者实例IProducer<Fruit> fruitProducer = new FruitProducer();IProducer<Apple> appleProducer = new AppleProducer();// 生成水果和苹果Fruit fruit = fruitProducer.Produce();Apple apple = appleProducer.Produce();// 输出结果Console.WriteLine($"Produced: {fruit.Name}");Console.WriteLine($"Produced: {apple.Name}");}
}

协变性+委托

using System;// 定义协变的泛型委托
public delegate T ProducerDelegate<out T>();// 定义协变的泛型接口
public interface IProducer<out T>
{T Produce();
}// 实现生产者类
public class FruitProducer : IProducer<Fruit>
{public Fruit Produce(){return new Fruit("Apple");}
}public class AppleProducer : IProducer<Apple>
{public Apple Produce(){return new Apple("Granny Smith");}
}// 基类和子类
public class Fruit
{public string Name { get; }public Fruit(string name){Name = name;}
}public class Apple : Fruit
{public Apple(string name) : base(name) { }
}// 主程序
class Program
{static void Main(){// 创建生产者实例IProducer<Fruit> fruitProducer = new FruitProducer();IProducer<Apple> appleProducer = new AppleProducer();// 创建委托实例ProducerDelegate<Fruit> fruitDelegate = fruitProducer.Produce;ProducerDelegate<Apple> appleDelegate = appleProducer.Produce;// 生成水果和苹果Fruit fruit = fruitDelegate();Apple apple = appleDelegate();// 输出结果Console.WriteLine($"Produced: {fruit.Name}");Console.WriteLine($"Produced: {apple.Name}");}
}

非协变性+委托

using System;// 定义非协变的泛型委托
public delegate T ProducerDelegate<T>();// 定义非协变的泛型接口
public interface IProducer<T>
{T Produce();
}// 实现生产者类
public class FruitProducer : IProducer<Fruit>
{public Fruit Produce(){return new Fruit("Apple");}
}public class AppleProducer : IProducer<Apple>
{public Apple Produce(){return new Apple("Granny Smith");}
}// 基类和子类
public class Fruit
{public string Name { get; }public Fruit(string name){Name = name;}
}public class Apple : Fruit
{public Apple(string name) : base(name) { }
}// 主程序
class Program
{static void Main(){// 创建生产者实例IProducer<Fruit> fruitProducer = new FruitProducer();IProducer<Apple> appleProducer = new AppleProducer();// 创建委托实例ProducerDelegate<Fruit> fruitDelegate = fruitProducer.Produce;ProducerDelegate<Apple> appleDelegate = appleProducer.Produce;// 生成水果和苹果Fruit fruit = fruitDelegate();Apple apple = appleDelegate();// 输出结果Console.WriteLine($"Produced: {fruit.Name}");Console.WriteLine($"Produced: {apple.Name}");}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • c语言----取反用什么符号
  • qt笔记之纯qml项目详解
  • ant design pro 如何去保存颜色
  • Python 轻量级 Web 应用框架 Flask
  • 练习题 - 探索命名空间和作用域
  • 调试和优化大型深度学习模型 - 5 启动训练命令
  • 8.16-ansible的应用
  • 【区块链+金融服务】基于区块链的供应链金融系统 | FISCO BCOS应用案例
  • 主机ssh连接不上vmware的虚拟机
  • Java算法题——二分查找法
  • MemFire Cloud是否真的可以取代后端
  • 【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端
  • Token 设计
  • SpringBoot响应式编程(2)WebFlux入门
  • 文心快码(Baidu Comate)快速创建数据可视化图表
  • [译] 怎样写一个基础的编译器
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JS+CSS实现数字滚动
  • text-decoration与color属性
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 构造函数(constructor)与原型链(prototype)关系
  • 前端之React实战:创建跨平台的项目架构
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序设置上一页数据
  • 小程序开发之路(一)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #70结构体案例1(导师,学生,成绩)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (分类)KNN算法- 参数调优
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (十三)Flask之特殊装饰器详解
  • (四)Linux Shell编程——输入输出重定向
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转载)虚函数剖析
  • .form文件_SSM框架文件上传篇
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core中的时区转换问题
  • .NET delegate 委托 、 Event 事件
  • .NetCore发布到IIS
  • .NET单元测试
  • .NET开源、简单、实用的数据库文档生成工具
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /etc/skel 目录作用
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • []C/C++读取串口接收到的数据程序
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)