2012-03-05 24 views
5

xin lỗi nếu đó là một danh hiệu câm, tôi không biết làm thế nào để thể hiện điều này rõ ràngscala - vượt qua tự loại chú thích lớp đối tượng con

nói rằng tôi có một đặc điểm khai thác gỗ:

trait Logging { 
    def log(s:String) 
} 

và sau đó một số thực hiện

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

mà tôi sử dụng như thế này

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

tôi có thể sử dụng lớp này như

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

bây giờ những gì nếu tôi có điều này

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

trong ComplexProcess tôi muốn tạo một tiến trình con trộn trong đặc điểm khai thác gỗ tương tự mà đã được trộn vào ComplexProcess, nhưng ComplexProcess không biết đó là gì. có cách nào để có được một tham chiếu đến nó?

Trả lời

4

Bạn không thể làm điều đó. Trong trường hợp này, bạn có thể làm điều gì đó như sau:

trait WithSubProcess { 
    def s: SubProcess 
} 

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

đây là bản chất những gì tôi đang làm, nhưng nó xấu xí bởi vì tôi có tất cả những đặc điểm này nằm rải rác trong suốt mã của tôi có mục đích duy nhất là để đăng nhập vào bánh. hy vọng có một cách tốt hơn – dvmlls

1

Ghi nhật ký là trường hợp điển hình cho Lập trình hướng Aspect. Bạn có thể thử sử dụng AspectJ với scala: xem this article by Jonas Boner

2

Câu trả lời là, theo định nghĩa, không. Scala là một ngôn ngữ đánh máy tĩnh, vì vậy thông tin này chỉ thực sự có sẵn tại thời gian biên dịch. Với một API phản chiếu rộng hơn và một số cấu trúc/lắp ráp hacks nó có thể có thể trong tương lai, mặc dù đó là chỉ đạo nguy hiểm gần với Aspect định hướng lập trình, như Paolo đã đề cập.

Các vấn đề liên quan