建立与泛型的关系

Dan*_* L. 2 .net c# oop generics

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

让我给你举个例子:

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>
{ }
Run Code Online (Sandbox Code Playgroud)

}

这个层次结构的根是Interface.然后,我们有一个Class可能只来自特定的Interface.

Method必须属于一个具体实施的Class.

Parameter可能只能通过特定Method实现来实现.

有没有更好的方法来解决这个问题?我在C#generics语法方面有点生疏,因为我过去一年一直在C和Go游泳.

Eri*_*ert 8

听起来您正试图在类型系统中捕获业务域的业务规则 - 接口和类以及方法和参数.

我建议你不要试着这样做.它往往会导致痛苦,因为类型系统的规则不一定完全映射到业务域的规则.

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

泛型旨在解决容器,比较器,monadic类型(如可空,序列,未来,懒惰等)和其他简单类型结构的问题.我的经验法则:如果你不能在你的描述中使用"of"这个词,或者做一个很容易的形容词,那就不要使用泛型."一碗苹果,一碗橘子,好吧,听起来像碗是通用的.数字的顺序,名字的顺序,肯定.可以约会的日期,懒惰的字符串." 所有这些都很好,很容易.接口类?不太清楚.

更多想法:

https://ericlippert.com/2015/04/27/wizards-and-warriors-part-one/