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
Nguồn
2013-03-25 13:52:23
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'. –
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