Scala 班级之间的信息交流

Scala 班级之间的信息交流,scala,class,Scala,Class,我必须在UID的帮助下将几个对象相互链接起来,所以我提出了第一个没有编译的代码,然后我得到了这个我不理解的解决方案 为什么我们需要一个伴生对象来将一个类引用到另一个类 您可以使用幻影类型模式,如下所示 import java.util.UUID def generate = UUID.randomUUID() case class Id[A](value: UUID) case class BigBrand (name : String, id : Id[BigBrand]) case c

我必须在UID的帮助下将几个对象相互链接起来,所以我提出了第一个没有编译的代码,然后我得到了这个我不理解的解决方案

  • 为什么我们需要一个伴生对象来将一个类引用到另一个类

您可以使用幻影类型模式,如下所示

import java.util.UUID
def generate = UUID.randomUUID()

case class Id[A](value: UUID)
case class BigBrand (name : String, id : Id[BigBrand])
case class Outlet(name: String, big_brand_id: Id[BigBrand], id : Id[Outlet])

val tutu=BigBrand("tutu", Id(generate))
val toto=BigBrand("toto", Id(generate))
println(s"BigBrand id : ${tutu.id}")
println(s"BigBrand id : ${toto.id}")
val tutu1=Outlet("tutu1",tutu.id, Id(generate))
val toto2=Outlet("toto2",toto.id, Id(generate))
println(s"Outlet id : ${tutu1.id} linked with : ${tutu1.big_brand_id}" )
println(s"Outlet id : ${toto2.id} linked with :${toto2.big_brand_id}" )
这是一个证明型式试验有效的证据

scala> Outlet("hoge", toto2.id, toto2.big_brand_id)
                            ^
       error: type mismatch;
        found   : Id[Outlet]
        required: Id[BigBrand]
                                      ^
       error: type mismatch;
        found   : Id[BigBrand]
        required: Id[Outlet]

这是失败的原始代码:

case class BigBrand (name: String, id: UUID = generate)
case class Outlet(name: String, big_brand_id: UUID = BigBrand.id, id: UUID = generate)
失败的原因是(根据评论)每个
BigBrand
都有自己独特的
id
。因此,当您创建
Outlet
时,必须为
BigBrand
的特定实例提供
id
BigBrand.id
(如果存在)将是所有
BigBrand
实例的常量

有两种处理方法,这两种方法都要求您使用
Outlet(name,big_brand)
创建
Outlet

第一种方法是将
BigBrand
实例放在
Outlet
中,而不仅仅是
id

case class Outlet(name: String, big_brand: BigBrand, id: UUID = generate) {
  def big_brand_id = big_brand.id
}
第二种方法是在创建
Outlet
时传递
BigBrand
实例,并从中提取
id

case class Outlet private(name: String, big_brand_id: UUID, id: UUID)

object Outlet {
  def apply(name: String, big_brand: BigBrand): Outlet =
    Outlet(name, big_brand.id, generate)
}
最好的选择可能是两者的混合:

class Outlet private (val name: String, big_brand: BigBrand) {
  val id = generate
  def big_brand_id = big_brand.id
}

object Outlet {
  def apply(name: String, big_brand: BigBrand): Outlet =
    new Outlet(name, big_brand)
}

这要求在创建
Outlet
时提供
BigBrand
,并使
name
id
big\u brand\u id
可见,而
big\u brand
是私有的。

BigBrand的每个实例是否都有不同的id,或者对于
BigBrand
的所有实例都是一样的?将一个类引用到另一个类是什么意思?所有类都必须有不同的id,这是为了区分每个实例。每个具有唯一uid的BigBrang实例都必须链接到具有唯一uidIt的Outlet实例。您想要的似乎可以在值级别而不是类型级别解决。你只需要这样做:
final case class Outlet(name:String,big\u brand\u id:UUID,id:UUID=generate)
。这样它工作正常,我认为它解决了问题并回答了“为什么”的问题as well=>bcz类型定义应该以这种方式编写,以避免编译器混淆。我认为我们不需要使用伴生对象来解决这个问题,因为我已将注释和您的答案确定为编译器混淆。谢谢你的帮助!
class Outlet private (val name: String, big_brand: BigBrand) {
  val id = generate
  def big_brand_id = big_brand.id
}

object Outlet {
  def apply(name: String, big_brand: BigBrand): Outlet =
    new Outlet(name, big_brand)
}