C# 与泛型建立关系

C# 与泛型建立关系,c#,.net,oop,generics,C#,.net,Oop,Generics,我试图在实现将属于彼此的对象之间建立类型层次结构。语法变得多余,让我相信我不是滥用泛型,就是有更聪明的方法来表示接口之间的这种关系 让我举个例子: interface Interface { } interface Class<I> where I : Interface { } interface Method<I, C> where I : Interface where C : Class<I> { } interface Par

我试图在实现将属于彼此的对象之间建立类型层次结构。语法变得多余,让我相信我不是滥用泛型,就是有更聪明的方法来表示接口之间的这种关系

让我举个例子:

interface Interface
{ }
interface Class<I>
    where I : Interface
{ }
interface Method<I, C>
    where I : Interface
    where C : Class<I>
{ }
interface Parameter<I, C, M>
    where I : Interface
    where C : Class<I>
    where M : Method<I, C>
{ }
接口
{ }
接口类
其中I:接口
{ }
接口方法
其中I:接口
C:班级在哪里
{ }
界面参数
其中I:接口
C:班级在哪里
其中M:方法
{ }
}

此层次结构的根是
接口
。然后,我们有一个
,它只能从特定的
接口
派生

方法
必须属于
的特定实现

参数
只能通过特定的
方法
实现


有没有更好的办法?我对C#泛型语法有点生疏,因为我在过去的一年里一直在C和Go中游弋。

听起来你好像在试图在类型系统中捕获业务领域的业务规则——接口、类、方法和参数

我建议你不要那样做。它往往会造成痛苦,因为类型系统的规则不一定会清晰地映射到业务域的规则

特别是:业务领域通常有许多形式的规则“X是一种Y,它被限制做Z”,这在使用Liskov替换原则的类型系统中很难表示:如果Y是一种X,X可以做Z,那么Y可以在需要Z-doer的上下文中使用

泛型被设计用来解决容器、比较器、一元类型(如nullable、sequence、future、lazy等)和其他简单类型结构的问题。我的经验法则是:如果你不能在你的描述中使用“of”这个词,或者做一个简单的形容词,那么就不要使用泛型。“一碗苹果,一碗橙子,好吧,听起来像是碗是通用的。数字的顺序,名字的顺序,当然。可以为空的日期,懒惰的字符串。”所有这些都很简单。接口类?不太清楚

这里有更多想法:


这实际上取决于您想如何使用它。现在你的问题似乎有点泛化,没有双关语的意思。你完全正确。所以答案是,是的,我滥用仿制药!这个想法源于使用诸如Unity之类的IoC框架来替换专有系统实现的不同部分。但是,您可以正确地假设,在某个时候,体系结构试图通过泛型捕获业务逻辑,而这正是滥用的开始。