所以我之前发表过关于从超类中访问子类的字段以解决我遇到的问题的帖子。但他们明确表示这几乎是不可能的。所以我举了一个我想要实现的例子:
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张票上有相同的号码时确认失败。它也必须能够以一种简单的方式在未来添加新产品(例如食物)(无需更改核心代码)。
答案 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。