在Scala中,有没有办法将特征“传递”到类中的变量?

时间:2011-07-26 07:56:32

标签: scala

假设我有一个可以检索市场货币的特质纽约证券交易所

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

有没有办法实现这个目标?

2 个答案:

答案 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
}