有企业和人。用户可以喜欢或发表关于企业的评论,但同样不能发生在一个人身上。当用户发布有关某项业务或喜欢它的内容时,该业务称为该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 的了解而言,我无法以令人满意的方式对这种特定的事态进行建模。现在我坚持认为这不是子类型,因为 Business不是:
class Business extends
TargetingRelation[Post,Business] with
TargetingRelation[Like,Business]
事实上,Business
完全不了解Post
. 这种关系实际上在Post
和之外Business
。此外,我想上面的代码甚至不会编译开始,因为它是从两次Business
继承的。TargetingRelation
见解是最受欢迎的。