将不同类型的项目放在列表中,并能够在其上进行映射

时间:2016-12-28 20:40:06

标签: scala type-variables

所以我之前发表过关于从超类中访问子类的字段以解决我遇到的问题的帖子。但他们明确表示这几乎是不可能的。所以我举了一个我想要实现的例子:

abstract class LotteryTicket(val numbers: String) { 

val price: Int

}

//The numbers are different for each ticket and are used to denote a winner in the end.

class GoldTicket(numbers: String) extends LotteryTicket(person) {

val price: Int = 10

}

class SilverTicket(numbers: String) extends LotteryTicket(person) {

val price: Int = 5

}

abstract class Drink {

val price: Int

}

object Water extends Drink {

val price: Int = 1

}

object Coffee extends Drink {

val price: Int = 2

}

class Bill

class Customer

班级'比尔'应该包含一个列表,其中可以包括饮料和彩票票据,可以计算总额,客户必须能够制作这样的账单。 Customer类还需要一种方法来确认购买并检查他的LottoryTicket上的数字是否与他购买的每张Ticket不同。因为当他在2张票上有相同的号码时确认失败。它也必须能够以一种简单的方式在未来添加新产品(例如食物)(无需更改核心代码)。

2 个答案:

答案 0 :(得分:3)

您希望您的“可计费”项目实现一个特征,从而暴露其共同特征。

  trait Billable { 
      def price: Int
  }
  class LotteryTicket(val numbers: String, val price: Int) extends Billable
  class GoldTicket(n: String) extends LotteryTicket(n, 10)
  class SilverTockent(n: String) extends LotteryTicket(n, 5)

  class Drink(val price: Int) extends Billable
  object Water extends Drink(1)
  object Coffee extends Drink(2)

  case class Bill(val items: Seq[Billable]= Seq.empty)
  {
    def amount = items.map(_.price).sum
    def add(b: Billable) = copy(b +: items)
  }

  case class Customer(bill: Bill = Bill()) {
    def buy(ticket: LotteryTicket) = {
      // validate numbers, whatever
      Customer(bill.add(ticket))
    }

    def buy(drink: Drink) = {
      Customer(bill.add(drink)
    }

    def howMuch = bill.total

    def validateAllTickets = bill.items.foreach {
       case ticket: LotteryTicket => makeSureNumberIsGood(ticket.numbers)
       case _ =>
    }
  }

答案 1 :(得分:1)

使用Dima类的Bill类的解决方案:

INSERT .. ON DUPLICATE KEY UPDATE ..

不要使用Int作为价格,而是使用BigDecimal。