2012-02-16 32 views
6

Tôi có đoạn mã sau:Scala - trộn trong một đặc điểm với nhập khẩu (nhập khẩu thừa kế)

trait A { 
    import org.somepackage.C._ 
} 

class B extends A { 
    def getValue = value 
       ^^^^^ 
} 

object C { 
    var value = 5 
} 

Giá trị trong lớp B không nhìn thấy được những gì có nghĩa là việc nhập khẩu vốn có của lớp A đã không được thừa kế bởi B, mặc dù value hiển thị hoàn toàn bên trong A. Làm thế nào để đạt được hiệu quả của việc thừa hưởng nhập khẩu để tôi có thể tránh nhập khẩu một cách rõ ràng những thứ giống nhau trong nhiều lớp, trong đó đặc điểm A kết hợp trong?

+1

Bản sao có thể có của [Trong Scala, làm cách nào để chuyển báo cáo nhập thông qua cho các lớp con?] (Http://stackoverflow.com/questions/7252126/in-scala-how-do-i-pass-import-statements- thông qua-to-subclasses) – Suma

Trả lời

11

Nhập không phải là thực thể hạng nhất không thể hiện hành vi bạn đang mong đợi. Thay vào đó có thể tái cấu trúc thiết kế của bạn thusly để đạt được một cái gì đó gần gũi:

trait A with C { 

} 

class B extends A { 
    def getValue = value // Now this will work. 
} 

trait C { 
    var value = 5 
} 

object C extends C 

Thành ngữ này được sử dụng trong Scalaz 6 cho người dùng thuế với hàng nhập khẩu càng ít càng tốt.

+0

Điều này dường như chỉ hoạt động nếu 'C' là một đặc điểm. Nếu 'C' là cái gì khác (trong trường hợp của tôi,' C' là một phương thức)? Khi tôi cố gắng sử dụng mẫu này, nó chỉ đơn giản nói 'Không thể giải quyết ký hiệu C' (trong đó 'C' là tên của phương thức mà tôi sẽ nhập vào thông qua' com.xyz.C'). – socom1880

+0

Hơn nữa, nếu tôi muốn bao gồm mọi thứ, như trong 'com.xyz._'? – socom1880

+0

Đối với cả hai điều trên, bạn cần phải di chuyển việc triển khai đến một đặc điểm, sau đó có một đối tượng đơn giản mở rộng đặc điểm, như trong câu trả lời. Các đặc điểm có thể được mở rộng để thực hiện "trộn", các đối tượng không thể. Để bao gồm mọi thứ, như com.xyz._, bạn cần triển khai com.xyz thông qua một đối tượng gói - với đối tượng gói tương tự được triển khai bằng cách mở rộng một đặc điểm có tất cả các triển khai thực tế. Sau đó, bạn có thể sử dụng đặc điểm đó để "trộn vào" ở nơi khác. – RD1

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