2012-07-13 33 views
7

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, BC 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, BC 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ể?

+0

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

+1

@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

+0

Đố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

Trả lời

6

Nó có vẻ như có hai khác biệt chính tôi bỏ qua:

  1. Mặc dù cả hai rõ ràng tự loại chú thích và extends từ khóa đơn giản mô tả một "là-một" mối quan hệ giữa hai loại, mối quan hệ đó là không thể nhìn thấy từ bên ngoài trong trường hợp cựu:

    scala> trait T 
    defined trait T 
    
    scala> class C { this: T => } 
    defined class C 
    
    scala> implicitly[C <:< T] 
    <console>:10: error: Cannot prove that C <:< T. 
    

    Đây là một điều tốt, bởi vì trong mẫu bánh bạn không muốn "module" của bạn đối tượng là vô tình, polymorphically sử dụng như một trong những đặc điểm trên mà nó phụ thuộc.

  2. As noted explicitly by Mushtaqindirectly by Daniel, phụ thuộc có thể được cyclic khi sử dụng chú thích tự nhập. Các phụ thuộc tuần hoàn là rất phổ biến và không nhất thiết là xấu (giả sử các thành phần phụ thuộc không yêu cầu nhau để khởi tạo, hoặc bằng cách nào đó chúng ta có thể tie the knot giữa chúng), vì vậy đây là một lợi ích rõ ràng khác của các chú thích tự gõ trên thừa kế.

1

Khi bạn sử dụng thừa kế, bạn đưa ra quyết định về thứ tự khởi tạo. Khi bạn sử dụng các loại tự, bạn hãy để nó mở.

Có những khác biệt khác, nhưng tôi nghĩ hầu hết trong số đó là chi tiết triển khai và có thể biến mất. Tôi biết một số trong số đó.

+1

Tôi muốn được ưa thích hơn "khi bạn sử dụng di sản thừa kế, Thiên Chúa giết chết một con mèo con." – mergeconflict

+0

Trên một lưu ý nghiêm trọng hơn ... Tôi không hiểu tại sao bạn đề cập đến các loại phụ thuộc vào con đường ở đây; họ có tạo sự khác biệt trong lựa chọn giữa việc sử dụng 'mở rộng' so với loại tự? – mergeconflict

+0

@mergeconflict Suy nghĩ lại, các lớp thực sự được mở rộng thường là cấp cao nhất - các lớp lồng nhau thường được gọi bên trong chúng. Tôi nghĩ rằng tôi sẽ thả nó từ câu trả lời, nhưng thứ tự khởi tạo là một mối quan tâm. Có những khác biệt khác, nhưng tôi đã được sửa chữa trước đó bởi quyền hạn cao hơn để có hiệu lực mà nhiều người trong số họ là chi tiết thực hiện thay vì bằng thiết kế. –

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