Dường như việc sử dụng phổ biến nhất của explicitly-typed self references Scala là trong "Cake pattern", trong đó phụ thuộc của một mô-đun được khai báo như sau:Tính hữu dụng của tài liệu tham khảo tự rõ ràng, đánh máy trong Pattern Bánh
class Foo { this: A with B with C =>
// ...
}
Nói chung, bỏ qua những mẫu bánh trong một khoảnh khắc, A
, B
và C
có thể tham khảo bất cứ điều loại cấp, chẳng hạn như một tham số kiểu:
class Outer[A, B, C] {
class Inner { this: A with B with C =>
// ...
}
}
... hoặc một loại thành viên trừu tượng:
class Outer {
type A
type B
type C
class Inner { this: A with B with C =>
// ...
}
}
Trong không ai trong số những trường hợp này có thể chúng tôi đã viết abstract class Inner extends A with B with C
, vì A
, B
và C
không được biết đến là những đặc điểm. Các tài liệu tham khảo tự gõ rõ ràng là cần thiết ở đây. Tuy nhiên, tôi đã chỉ từng nhìn thấy mô hình bánh thực hiện với những đặc điểm:
trait A { def a }
trait B { def b }
trait C { def c }
class Foo { this: A with B with C =>
// ...
}
Trong trường hợp này, chúng tôi thay vì có thể viết abstract class Foo extends A with B with C
trực tiếp, mà nếu tôi không nhầm có ý nghĩa tương tự. Tôi có đúng không? Nếu không, thì làm thế nào để chúng khác nhau; và nếu vậy, tại sao mọi người dường như sử dụng tham chiếu tự đánh máy rõ ràng bất kể?
có thể trùng lặp của [Sự khác biệt giữa các loại tự scala và các lớp con đặc điểm là gì?] (Http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self -types-và-trait-subclasses) – sschaef
@sschaef câu hỏi khác nhau ở đó, nhưng một trong những bình luận của Daniel dưới câu trả lời của ông có thể là câu trả lời tôi đang tìm ... Có vẻ tương tự có thể thừa kế 'công khai' so với' được bảo vệ 'thừa kế trong C++? – mergeconflict
Đối với tôi, cả hai câu hỏi dường như đều muốn biết điều tương tự - chúng khác nhau về các lớp trừu tượng so với các đặc điểm có cùng hướng. Hay tôi về cơ bản có hiểu điều gì đó sai? – sschaef