2013-03-25 24 views
9

mã trong Java này biên dịch không có lỗi:Thực hiện đặc điểm nội tại Scala như chúng tôi làm với giao diện bên trong Java

interface T { 
    interface Q { 
    } 
} 

class C implements T.Q { 
} 

trong khi mã này trong Scala không:

trait T { 
    trait Q { 
    } 
} 

class C extends T.Q { 
} 

là gì đúng dịch (nếu nó tồn tại) của danh sách mã Java vào Scala?

Giải thích lý thuyết về thiết kế ngôn ngữ được hoan nghênh.

+1

Ngoài những gì người khác đã trả lời về các loại đường phụ thuộc, nó cũng đáng chú ý là ký hiệu Scala của cho 'T.Q' Java là 'T # Q'. –

+0

Cú pháp 'T # Q' Oleg được gọi là [loại chiếu] (http://stackoverflow.com/questions/6676048/why-does-one-select-scala-type-members-with-a-hash -instead-of-a-dot). Và lưu ý rằng bạn * có thể * mở rộng Q nếu bạn làm điều đó trong một loại có nguồn gốc từ T, ví dụ: 'class A mở rộng T {class B mở rộng Q}'. – AmigoNico

Trả lời

10

Loại nội Q được xác định duy nhất để thực hiện dụ cụ thể của T tính trạng. Vì scala có loại phụ thuộc vào đường dẫn, mỗi trường hợp của T sẽ có một phần phụ của riêng mình Q.

scala> trait T { 
    | trait Q 
    | } 
defined trait T 

scala> class C extends T { 
    | def getQ: this.Q = new this.Q {} 
    | } 
defined class C 

scala> val inC = (new C).getQ 
inC: C#Q = [email protected] 


scala> val c = new C 
c: C = [email protected] 

scala> new c.Q {} 
res4: c.Q = [email protected] 

Nếu bạn cần một giao diện cho một hành vi chung cho khách hàng của bạn để thực hiện, và không phụ thuộc vào một C dụ cụ thể, bạn cần xác định nó trong vòng một Object

scala> object T { 
    | trait Q { 
    |  def implementMe: Unit 
    | } 
    | } 
defined module T 

scala> val inT = new T.Q { 
    | def implementMe = println("implemented!") 
    | } 
inT: T.Q = [email protected] 

scala> inT.implementMe 
implemented! 

Tại sao các loại phụ thuộc vào đường dẫn?

Đối với những lý do thiết kế, nhìn here

3

Bạn không thể làm điều đó. Khi các kiểu được lồng nhau, bạn đang tạo một loại được gọi là loại phụ thuộc vào đường dẫn, có nghĩa là loại mỗi thể hiện của thực thể bên trong được gắn với cá thể cụ thể trong đó nó được tạo.

Nói cách khác, bạn có giao diện Q không có sự tồn tại độc lập mà sẽ cho phép bạn để đề cập đến nó ngoài một thể hiện của T.

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