c# - 在非类集合类中使用泛型

标签 c# design-patterns generics class

我正在开发一个引擎,它可以由用户(不是最终用户,图书馆用户)配置以使用不同的组件。 例如,假设类 Drawer必须有一个 ITool , PencilBrush , 和一个 IPattern , PlainMosaic .另外,假设一个 Brush必须有一个 IMaterial CopperWood

说一下选择Pencil的效果或 Brush确实有很大的不同,IPattern也是如此类型。编码 Drawer 是不是一个坏主意?像这样的通用概念类:

public class Drawer<Tool, Pattern> where Tool: ITool where Pattern : IPattern { ... }
public class Brush<Material> where Material : IMaterial { ... }

然后可以像这样使用该类:

Drawer<Pencil, Mosaic> FirstDrawer = new Drawer<Pencil, Mosaic>();
Drawer<Brush<Copper>, Mosaic> SecondDrawer = new Drawer<Brush<Copper>, Mosaic>();

我主要将泛型用于集合等,并没有真正看到泛型用于这类事情。我应该吗?

最佳答案

除非您创建的引擎具有带参数的方法或返回类型为泛型类型,否则使用泛型实际上没有任何意义。 IE。你会期望有一个像

这样的属性和方法
public <Material> Material { get; }
public void Draw(<Tool> pen);

(我目前处于Java模式,如果错误请更正C#语法!)

从示例中我可以看出,您仅将泛型用于类的构造函数。由于您依赖于实现中的接口(interface),因此使用泛型并没有真正增加值(value)。

也许我错了,但泛型实际上是为了在编译时检查类型安全并避免大量(有风险的)类型转换。

关于c# - 在非类集合类中使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664747/

相关文章:

c# - 在 Windows 10 上,如何使用 shell 执行动词 "SendTo"以编程方式从 C# 发送一组文件到 CD/DVD 刻录机

mvvm - 从用户交互和服务事件更新 View 模型的好模式是什么?

ios - 如何根据参数的属性约束函数泛型类型?

c# - 在 C# 类中调用方法

c# - 为什么这不是自动推断的?

c# - 当 where 子句与 NULL 值进行比较时,LINQ-to-SQL 查询不返回行

c# - EF核心: how to share foreign key properties between several zero/one-to-many relationships

java - 如何消除对 Java Bean 的硬依赖

c# - 数据绑定(bind)文本框舍入值

PHP MVC 最佳实践 - 将 session 变量从 Controller 传递到模型类或直接在模型中访问