2012-04-21 6 views
6

ich eine Marke Klasse, die mehrere Produktescala: Erstellen einer Basis Eltern-Kind-Beziehung zu modellieren

Und in der Produktklasse Ich möchte einen Verweis auf die Marke haben, wie folgt aus:

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

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

Wie kann ich diese Klassen pumpen?

Ich meine, ich kann nicht ein Produkt zu erstellen, wenn ich eine Marke haben

Und ich kann die Marke nicht schaffen, es sei denn ich eine Liste der Produkte haben (weil Brand.products ist ein val)

Was wäre der beste Weg, um diese Art von Beziehung zu modellieren?

Antwort

6

Ich würde fragen, warum Sie die Informationen wiederholen, indem Sie sagen, welche Produkte zu welcher Marke in der Liste und in jedem Produkt gehören.

Dennoch können Sie es tun:

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))) 

By-Name params scheinen nicht leider für Fallklassen zugelassen zu werden.

Siehe auch diese ähnliche Frage: Instantiating immutable paired objects

+0

Es scheint wirklich das, was ich suche, ich versuchte es auf dem ers und es sagt mir, dass birdseye nicht gefunden, ich benutzen musste: Paste-Modus und es funktionierte ok, aber wie Sie sagten, Die Case-Klasse wird nicht unterstützt :-( – opensas

+0

Ich habe die Markenreferenz hinzugefügt, um sie auf beide Arten durchqueren zu können, aber ich denke, dass sie in einem funktionalen Ansatz mehr Kopfschmerzen als Vorteile bringt ... Habe ich Recht? – opensas

+0

@opensas it Es ist ein bisschen Kopfschmerzen, aber manchmal notwendig, sonst müssen Sie 'var' für die Felder verwenden und riskieren,' null' zu haben, aber diese Version ist sicher –

3

Da Ihre Frage bezieht sich auf Modell zu dieser Beziehung, ich will sagen, warum sie nicht wie modellieren, was wir in der Datenbank zu tun? Trennen Sie die Entität und die Beziehung.

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