假设我有一个可以检索市场货币的特质纽约证券交易所
trait NYSE extends Market {
override def getCurrency = "USD"
}
现在假设我有一个需要知道货币的交易者类。易:
val trader = new Trader with NYSE
然而,假设在交易者中我有类似
的东西val Database = new Database
但我真的想传递市场信息,以便
val trader = new Trader with NYSE
自动初始化内部变量,如下所示
val Database = new Database with NYSE
类似地
val trader = new Trader with LSE
自动执行
val Database = new Database with LSE
有没有办法实现这个目标?
答案 0 :(得分:5)
我认为类型类非常适合您所寻找的内容:
trait Currency[T] { def get: String }
trait DatabaseProvider[T] { def get: String }
object Markets {
trait NYSE
implicit case object NYSECurrency extends Currency[NYSE] {
def get = "USD"
}
implicit case object NYSEDBProvider extends DatabaseProvider[NYSE] {
def get = "NYSE_DB"
}
}
class Trader[T](
implicit val currency: Currency[T],
val dbProvider: DatabaseProvider[T]
) {
def getCurrency = currency.get
def getDatabase = dbProvider.get
}
object Demo extends App {
import Markets._
val trader = new Trader[NYSE]
println( trader.getCurrency )
println( trader.getDatabase )
}
您可以添加任意数量的市场,并完全解除不同的实施方式。
答案 1 :(得分:2)
你能
吗?trait DatabaseProvider { def getDatabase: Database }
class Trader extends DatabaseProvider {
val Database = getDatabase
...
}
trait NYSE extends Market with DatabaseProvider {
override def getCurrency = "USD"
def getDatabase = new Database with NYSE
}