2012-10-12 27 views
50

Tôi thấy rằng các đặc điểm trong Scala tương tự như giao diện trong Java (nhưng giao diện trong Java mở rộng các giao diện khác, chúng không mở rộng một lớp). Tôi thấy an example on SO about traits usage nơi một đặc điểm mở rộng một lớp học.Tại sao đặc điểm Scala có thể mở rộng một lớp học?

Mục đích của việc này là gì? Tại sao các đặc điểm có thể mở rộng các lớp học?

+1

Nếu bạn đọc câu trả lời bạn đã liên kết, bạn sẽ thấy các đặc điểm rất khác với giao diện vì chúng có thể chứa các triển khai. –

+2

Bạn cũng có thể quan tâm đến sự khác biệt giữa thừa kế thừa kế và tự chú thích loại: http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait- Các lớp con –

+0

Vâng, tôi hiểu điểm đặc điểm, không giống như giao diện có thể chứa một phần các phương thức, nhưng tôi không chắc chắn về mục đích của các đặc điểm mở rộng các lớp (như được giải thích trong ví dụ) – Raj

Trả lời

65

Có họ có thể, một trait mà kéo dài một class đặt một hạn chế về những gì classes có thể mở rộng mà trait - cụ thể là, tất cả classes đó trộn-in mà trait phải mở rộng mà class.

scala> class Foo 
defined class Foo 

scala> trait FooTrait extends Foo 
defined trait FooTrait 

scala> val good = new Foo with FooTrait 
good: Foo with FooTrait = [email protected] 

scala> class Bar 
defined class Bar 

scala> val bad = new Bar with FooTrait 
<console>:10: error: illegal inheritance; superclass Bar 
is not a subclass of the superclass Foo 
of the mixin trait FooTrait 
     val bad = new Bar with FooTrait 
          ^
+13

Thú vị. Nhưng bạn cũng có thể giới hạn các lớp mà trong đó một đặc điểm có thể được trộn lẫn bằng cách đặt một ràng buộc kiểu vào kiểu tự, ví dụ: 'đặc điểm FooTrait {self: Foo =>}'. Khi nào bạn sử dụng một kỹ thuật so với kỹ thuật kia? – AmigoNico

+0

Scala trở nên khá điên rồ với mọi công việc đánh máy. Tôi chắc chắn có thể thấy điều này có thể khá hữu ích, nhưng ai cũng có thể đưa ra ví dụ cụ thể? –

+1

@AmigoNico [ở đây] (http://stackoverflow.com/q/36945333/2032064) là một ví dụ khi bạn có thể thích kế thừa từ một lớp học. – Mifeet

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