企業も人もいます。ユーザーは、ビジネスについて「いいね!」したり、コメントを投稿したりできますが、同じことは個人には起こりません。ユーザーがビジネスについて何かを投稿したり、いいね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
ます。その上、上記のコードは2回Business
から継承しているため、そもそもコンパイルすらしないと思います。TargetingRelation
洞察は大歓迎です。
related :クラス型パラメーターにバインドされたコンテキストを使用する