2011-07-26 22 views
1

假設我有一個特點NYSE可以檢索市場貨幣在斯卡拉,是否有一種方法可以在課堂上「穿越」特徵到變量?

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 

有沒有辦法來實現這一目標?

回答

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) 
} 

您可以添加你想要儘可能多的市場,你脫開完全不同的實現。

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 
} 
+0

假設我想在數據庫中執行:def myFunction {val currency = getCurrency}。這可以做到嗎? – deltanovember

+0

@deltanovember - 據我所知,並不如書面。 –

相關問題