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 に答える