【发布时间】:2019-03-03 12:09:05
【问题描述】:
假设我有一个可能的列表信用卡
val availableCreditsCard = List(MasterCardCreditCard, VisaCreditCard)
这两个类都扩展了一个名为CreditCard的特征
现在,我想创建一个名为 isValid 的方法,它接受 trait CreditCard
类似:
def isValid(creditCard: CreditCard): Boolean = {
creditCard match {
case t: MasterCardCreditCard => MasterCardCreditCardPayment.isValid(t)
case s: VisaCreditCard => VisaCreditCardPayment.isValid(s)
}
}
MasterCardCreditCardPayment 和 VisaCreditCardPayment 都扩展了一个名为 CreditCardPayment 的特征。
所以,现在,我的问题是,如果我想用他自己的 CreditCardPayment (AmexCreditCardPayment) 添加一个新的可能的 CreditCard (Amex),但只需更改列表 availableCreditsCard 并且不触及 在 isValid 方法中匹配/大小写?
是否可以根据availableCreditsCard 列表动态创建此匹配/案例?
编辑
这是 CreditCardPayment 特征。
trait CreditCardPayment[CreditCard] {
def isValid(creditCard: CreditCard): Boolean
def checkCVV(creditCard: CreditCard): Boolean
}
还有一个VisaCreditCardPayment的例子
object VisaCreditCardPayment extends CreditCardPayment[VisaCreditCard] {
override def isValid(creditCard: VisaCreditCard): Boolean = {
val listValidCreditCard = loadFile()
listValidCreditCard.contains(creditCard)
}
//Implemented because it the trait, not necessary
override def checkCVV(creditCard: VisaCreditCard): Boolean = {
val listCreditCard = loadFile()
val cvvToCheck = creditCard.cvv
listCreditCard.exists(_.cvv == cvvToCheck)
}
}
现在,您的建议是,在 isValid 方法中,使用 case t => CreditCardPayment.isValid(t)。这甚至是不可能的,因为CreditCardPayment 是一个特征:(
【问题讨论】:
-
如果您要更改要求,我认为您也必须更改代码,并且应该避免任何错误。
-
是的,我完全同意这一点,我自己想,好吧,是的,如果我添加一种新的付款方式,我应该更改代码本身以更加确定一切都会正常工作,但是,您认为这有可能吗?
-
只需在
CreditCard上创建一个方法.isValid。然后你可以只做creditCard.isValid()没有任何辅助代码来保持同步。 -
如果你想在所有其他类型的卡片上执行一些通用功能,你可以在你的火柴盒中写上_case。
-
@AntonioCalì 你没有在特征上实现它,只是在那里声明它。然后为每个子类实现。
标签: scala