2011-07-26 4 views
1

가정하자 나는스칼라에서 클래스 내의 변수에 특성을 "통과"시키는 방법이 있습니까?

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

I 형 클래스는 당신이 찾고있는 무엇을 위해 완벽하다 생각 할 수 있습니다.

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 - 내가 아는 한, 서면으로 작성한 것이 아닙니다. –

관련 문제