2011-07-26 5 views
1

私は市場の通貨にScalaでは、クラス内の変数に特性を「パススルー」する方法はありますか?

trait NYSE extends Market { 
    override def getCurrency = "USD" 
} 

を取得することができ、形質NYSEがあるとは、今、私は通貨を知っている必要があるトレーダークラスがあるとします。簡単:

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 

していますか?

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

あなたがしたいとあなたは完全に異なる実装を切り離すなど多くの市場を追加することができます。

答えて

5

私はあなたが探しているもののための型クラスが完全であると考えることができます。

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 - 私が知っている限りではなく、書いたとおりではありません。 –

関連する問題