Scala набрал черты и соответствовал типу - PullRequest
1 голос
/ 23 ноября 2011

В настоящее время я работаю над приложением электронной коммерции в scala / lift и не могу понять, как правильно сопоставить мою иерархию типов. моя текущая реализация:

abstract trait BaseProduct[T <: BaseProduct[T]] extends MongoRecord[T] with ObjectIdPk[T] {
  self:T =>
  def whatever
  ...
}

abstract trait SimpleType[T <: BaseProduct[T]] extends BaseProduct[T] {
  self:T =>
  val producttype = "product/simple"
}

abstract trait ConfigurableType[T <: BaseProduct[T],E <: SimpleType[E]] extends BaseProduct[T] {
  self: T =>
  val producttype = "product/configurable"
}

class ClothingProduct extends SimpleType[ClothingProduct] {
  def meta = ClothingProduct
}

class ConfigurableClothing extends ConfigurableType[ConfigurableClothing,ClothingProduct] {
  val childmeta = ClothingProduct
  val configurableFields = List(color,size)
  def meta = ConfigurableClothing
}

Имея это в виду, я хочу реализовать корзину покупок, которая должна принимать только продукты типа SimpleType (и BaseProduct). В нем также должна быть реализована функция, которая принимает любой вид BaseProduct с предложением сопоставления с образцом, который должен реагировать на то, что это простой или настраиваемый тип.

Мои первые реализации, которые сводят меня с ума из-за ошибок типа:

object Cart extends SessionVar[List[CartItem]](List()) {
  def addProduct(product:SimpleType[_],quantity:Int = 1) = {
    this.get.partition(_.product.id.is == product.id.is) match {
      case (Nil,xs) => this.set(CartItem(product,quantity) :: xs)
      case (x,xs) => this.set(CartItem(product,x.head.quantity + quantity) :: xs)
    }
  }
}

case class CartItem(product:SimpleType[_], quantity:Int)  {
  def lineTotal:Double = quantity * product.price.is
}

С помощью следующей функции, чтобы добавить корзину:

def addBasketLink(prod:BaseProduct[_]) = {
prod match {
  case x:SimpleType[_] => Cart.addProduct(x)
  case _ => S.notice("Sorry not possible to add to Basket")
}

Моя основная проблема заключается в том, что определение Underscore указанного типа для SimpleType приводит к ошибкам нарушения типа. В настоящее время я не могу понять, как правильно печатать. Было бы здорово, если бы кто-то мог сказать мне, где моя ошибка, и правильно объяснить мне, как я правильно работаю с набранными чертами.

Спасибо

...