Assume I have a List of possibles Credit Card
val availableCreditsCard = List(MasterCardCreditCard, VisaCreditCard)
Both those classes extends a trait called CreditCard
Now, I want to create a method, called isValid
that accept the trait CreditCard
Something like:
def isValid(creditCard: CreditCard): Boolean = {
creditCard match {
case t: MasterCardCreditCard => MasterCardCreditCardPayment.isValid(t)
case s: VisaCreditCard => VisaCreditCardPayment.isValid(s)
}
}
Both MasterCardCreditCardPayment and VisaCreditCardPayment extends a trait called CreditCardPayment
.
So, now, my question is, what if I want to add a new possible CreditCard (Amex), with his own CreditCardPayment (AmexCreditCardPayment), but just change the list availableCreditsCard
and doesn't touch the match/case inside the isValid method?
Is it possible to create dinamically this match/case based on the list availableCreditsCard
?
EDIT
This is the CreditCardPayment trait.
trait CreditCardPayment[CreditCard] {
def isValid(creditCard: CreditCard): Boolean
def checkCVV(creditCard: CreditCard): Boolean
}
and an example of 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)
}
}
Now, your suggestion is, inside the isValid
method, use a case t => CreditCardPayment.isValid(t)
. This is not even actual possible, since CreditCardPayment
is a trait :(
.isValid
a method onCreditCard
. Then you can just docreditCard.isValid()
without any auxiliary code to keep in synch. – Dima