6

我有一个包含多种产品的品牌类

在产品类中,我想引用品牌,如下所示:

case class Brand(val name:String, val products: List[Product])

case class Product(val name: String, val brand: Brand)

我怎样才能填充这些类???

我的意思是,除非我有品牌,否则我无法创造产品

除非我有产品列表,否则我无法创建品牌(因为 Brand.products 是 val)

模拟这种关系的最佳方法是什么?

4

2 回答 2

6

我会质疑您为什么要重复这些信息,即哪些产品与列表和每个产品中的哪个品牌相关。

不过,你可以这样做:

class Brand(val name: String, ps: => List[Product]) {
  lazy val products = ps
  override def toString = "Brand("+name+", "+products+")" 
}

class Product(val name: String, b: => Brand) { 
  lazy val brand = b
  override def toString = "Product("+name+", "+brand.name+")"
}

lazy val p1: Product = new Product("fish", birdseye)
lazy val p2: Product = new Product("peas", birdseye)
lazy val birdseye = new Brand("BirdsEye", List(p1, p2))

println(birdseye) 
  //Brand(BirdsEye, List(Product(fish, BirdsEye), Product(peas, BirdsEye)))

不幸的是,案例类似乎不允许使用按名称参数。

另请参阅这个类似的问题:实例化不可变配对对象

于 2012-04-21T20:27:46.157 回答
3

既然您的问题是关于模型与这种关系的,我会说为什么不像我们在数据库中所做的那样对它们进行建模?分离实体和关系。

val productsOfBrand: Map[Brand, List[Product]] = {
    // Initial your brand to products mapping here, using var
    // or mutable map to construct the relation is fine, since
    // it is limit to this scope, and transparent to the outside
    // world
}
case class Brand(val name:String){
    def products = productsOfBrand.get(this).getOrElse(Nil)
}
case class Product(val name: String, val brand: Brand) // If you really need that brand reference
于 2012-04-21T22:54:44.653 回答