我正在尝试在实现彼此属于的对象之间建立类型层次结构。语法变得多余,让我相信我要么滥用泛型,要么有更聪明的方法来表示接口之间的这种关系。
让我举个例子:
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游泳。
答案 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/