2012-03-05 4 views
5

그 바보 같은 제목 있다면 미안 해요, 난이 명확하게스칼라 -

내가 로깅 특성이 있다고 표현하는 방법을 모르는 자식 개체에 자기 형 주석 클래스를 전달합니다 다음

trait Logging { 
    def log(s:String) 
} 

과 난이

class SomeProcess { this:Logging => 
    def doSomeJunk() { 
     log("starting junk") 
     ... 
     log("junk finished") 
    } 
} 
0123처럼 사용하는 일부 구현

trait PrintlnLog extends Logging { 
    def log(s:String) { println(s) } 
} 

내가

val p = new SomeProcess() with PrintLog 
p.doSomeJunk() 
지금

내가있는 경우이

class SubProcess { this:Logging => 
    def doSubJunk() { 
     log("starting sub junk") 
     ... 
     log("finished sub junk") 
    } 
} 

class ComplexProcess { this:Logging => 
    def doMoreJunk() { 
     log("starting more junk") 
     val s = new SubProcess with // ??? <-- help! 
     s.doSubJunk() 
     log("finished more junk") 
    } 
} 
내가 ComplexProcess에 혼합 된 같은 로깅 특성에 혼합 서브 프로세스를 인스턴스화 할 ComplexProcess에서

하지만 같은이 클래스를 사용할 수 있습니다 ComplexProcess는 그것이 무엇인지 알지 못합니다. 거기에 대한 참조를 얻을 수있는 방법이 있습니까?

답변

4

당신은 그렇게 할 수 없습니다. 이 경우 다음과 같이하면됩니다.

trait WithSubProcess { 
    def s: SubProcess 
} 

class ComplexProcess { this: Logging with WithSubProcess ... } 
+0

이것은 본질적으로 내가하고있는 일이지만,이 모든 특성이 내 코드 전체에 흩어져 있기 때문에 추악합니다. 그 목적은 cake-in 로깅에 있습니다. 더 좋은 방법이 있기를 바랐다. – dvmlls

1

로깅은 Aspect Oriented Programming의 전형적인 경우입니다. AspectJ를 scala와 함께 사용해 볼 수도 있습니다 : this article by Jonas Boner

2

대답은 정의상 no입니다. 스칼라는 정적 유형 언어이므로이 정보는 컴파일 할 때만 사용할 수 있습니다. 좀 더 광범위한 리플렉션 API와 일부 구성/어셈블리 해킹이 가능할 수도 있지만, Paolo가 언급 한 것처럼 Aspect Oriented Programming에 위험 할 정도로 가까워지고 있지만 앞으로는 가능할 수도 있습니다.