有企业和人.用户可以喜欢或发布关于商家的评论,但对于一个人来说也不会发生同样的事情.当用户发布有关某个商家或喜欢它的内容时,该商家称之为target
喜欢或发布:
trait TargetingRelation[TargetingType[_],TargetedType] class Business class Person class Post[Target | TargetingRelation[Business,Post] ] { def target:Target } class Like[Target | TargetingRelation[Business,Like] ] { def target:Target }
在这里,我发明了一种T | P[T]
符号意义类型参数T
,使其满足某些属性P[T]
(或者T :|: P[T]
如果它具有更多的类型吸引力).代码中的其他地方我想要声明如下:
object canPostAboutBusiness extends TargetingRelation[Post,Business] object canLikeBusiness extends TargetingRelation[Like,Business]
这些对象实际上是证据,类似于Haskell类型类.所以这会打字检查:
val p = new Post[Business] val l = new Like[Business]
但不是这个:
val p = new Post[Person] val l = new Like[Person]
就我对Scala的认识而言,我无法以令人满意的方式对这种特殊情况进行建模.现在我坚持认为这不是子类型,因为商业不是:
class Business extends TargetingRelation[Post,Business] with TargetingRelation[Like,Business]
事实上,非常希望Business
仍然完全不知道Post
.的关系实际上是两外Post
和Business
.此外,我认为上面的代码甚至不会编译开始,因为Business
它继承了TargetingRelation
两次.很受欢迎.
related:使用类类型参数中的上下文绑定