建立与泛型的关系

时间:2017-06-15 23:38:24

标签: c# .net 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>
{ }

}

此层次结构的根是Interface。然后,我们有一个Class,它只能来自特定的Interface

Method必须属于Class的具体实现。

Parameter只能通过特定的Method实施来实施。

还有更好的方法吗?我在C#generics语法方面有点生疏,因为我去年在C和Go游泳。

1 个答案:

答案 0 :(得分: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/