2012-03-05 9 views
5

przepraszam, jeśli to jest głupi tytuł, nie wiem jak wyrazić to jasnoScala - Pass Typ własnym uwagami klasę do obiektu podrzędnego

że mam cechę rejestrowania:

trait Logging { 
    def log(s:String) 
} 

a następnie niektóre realizacja

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

którego używam jak ten

class SomeProcess { this:Logging => 
    def doSomeJunk() { 
     log("starting junk") 
     ... 
     log("junk finished") 
    } 
} 

mogę użyć tej klasy jak

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

co teraz, czy mam to

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

w ComplexProcess chcę instancję podproces mieszania w tej samej cechy rejestrowania, które zostały zmieszane w ComplexProcess, ale ComplexProcess nie wie, co to jest. czy istnieje sposób, aby uzyskać odniesienie do niego?

Odpowiedz

4

Nie możesz tego zrobić. W takim przypadku prawdopodobnie zrobiłbyś coś takiego:

trait WithSubProcess { 
    def s: SubProcess 
} 

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

to jest zasadniczo to, co robię, ale jest to brzydkie, ponieważ wszystkie te cechy są rozproszone w całym kodzie, którego jedynym celem jest rejestracja przy użyciu ciastek. miał nadzieję, że jest lepszy sposób – dvmlls

1

Rejestrowanie jest typowym przypadkiem dla programowania zorientowanego na aspekt. Możesz spróbować użyć AspectJ ze scala: zobacz this article by Jonas Boner

2

Odpowiedź brzmi, z definicji, nie. Scala jest statycznie napisanym językiem, więc ta informacja jest dostępna tylko w czasie kompilacji. Dzięki rozszerzonemu API do odczytywania i niektórym hackom składu/montażu może być możliwe w przyszłości, choć jest to niebezpiecznie blisko programowania zorientowanego na aspekt, o czym wspomniał Paolo.