В настоящее время я работаю над приложением электронной коммерции в 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 приводит к ошибкам нарушения типа. В настоящее время я не могу понять, как правильно печатать. Было бы здорово, если бы кто-то мог сказать мне, где моя ошибка, и правильно объяснить мне, как я правильно работаю с набранными чертами.
Спасибо