2011-08-30 31 views
19

Ngoài các khía cạnh thừa kế, có sự khác biệt giữa các lớp mẫu sau:gì được hơn Scala thành ngữ: đặc điểm TraitA kéo dài TraitB hoặc đặc điểm TraitA {tự: TraitB =>}

1| trait TraitA extends TraitB 

2| trait TraitA { self: TraitB => } 

Tôi muốn phân chia trách nhiệm giữa TraitATraitB nhưng trước đây không thể hoạt động mà không có tính năng sau.

Bạn thể hiện ý định này như thế nào? Đối với tôi giải pháp [2] sẽ là cách tiếp cận tự nhiên hơn. Tuy nhiên, tôi không muốn đặt gánh nặng lên người thực hiện trộn lẫn trong những gì cần phải được trộn lẫn trong anyway.

+0

bản sao có thể có của [Sự khác biệt giữa các loại tự scala và các lớp con đặc điểm?] (Http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types- và-trait-subclasses) –

Trả lời

16

Sở thích của tôi thường [1] vì, như bạn nói, người triển khai không phải là gánh nặng để trộn vào (một loại phụ) TraitB. Có lẽ [2] là thích hợp hơn nếu, vì lý do nào đó, nó là mong muốn không để kế thừa các triển khai cụ thể trong TraitB và buộc người triển khai thực hiện lựa chọn giữa các loại phụ của TraitB. Tuy nhiên, [1] cũng linh hoạt.

tôi có xu hướng sử dụng [2] chỉ khi cần thiết, chẳng hạn như khi loại không phải là một lớp đã biết hoặc đặc điểm,

// Here, Matrix cannot extend type parameter Repr 
trait Matrix[+Repr <: Matrix[Repr]] { self: Repr => 
    ... 
} 

Update. Đây là một sự khác biệt nhỏ,

trait B 
trait A { self: B => } 
def g(ab: A): B = ab // Type mismatch: found A, required B 

Đó là một chút khó chịumột hạn chế tùy chọn không để có thể sử dụng như một AB, mặc dù loại được kết hợp.

+2

Nói về cập nhật của bạn. Tôi nghĩ rằng "ít phiền toái" là khá hữu ích để cho một trong những thể hiện rằng một 'A'" hợp tác với "nhưng cùng một lúc" không phải là "một' B'. Đối với tôi, nó giống như thừa kế riêng tư và công khai tương ứng. –

+0

Ah, đó là một cách hay để nghĩ về nó. Tôi sẽ cập nhật lại. –

+0

Trong lịch sử, động lực cho chú thích tự gõ là sự khác biệt đầu tiên - ít nhất, đó là cách tính năng này được thúc đẩy trong bài báo * Tóm tắt thành phần có thể mở rộng * của Odersky & Zenger (mà bạn có thể tìm thấy trên Google Scholar nếu thích). – Blaisorblade

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