2012-01-05 39 views
9

Khi hai đặc điểm được định nghĩa như thế này,là gì sự khác biệt giữa "lớp C kéo dài A với B" và "lớp C mở rộng B" khi đặc điểm B kéo dài đặc điểm Một

trait A 
trait B extends A 

sự khác biệt giữa những gì là hai.

class C extends B 
class D extends A with B 

Tôi không nghĩ rằng đó là cần thiết cho lớp C hoặc D để mở rộng đặc điểm A từ đặc điểm B đã mở rộng đặc điểm A.

Tại sao điều này thường được viết "class D mở rộng A với B"?

Trả lời

6

Đó là một câu hỏi khá hay ... Tôi sẽ thử để trả lời bằng phản hồi chủ quan.

Tôi đoán rằng mở rộng A mixin với B là rất quan trọng khi phân cấp sẽ được linearized, trong trường hợp đặc biệt này không có sự khác biệt nhưng những gì nếu bạn mixin D với một đặc điểm E rằng reimplements một số chức năng (nhưng không phải tất cả) từ A không được thông báo rõ ràng trong số B cho nhu cầu của bạn trong D. Vì vậy, bạn sẽ phải

class D extends A with E with B 

Hơn nữa trong trường hợp đó, chúng tôi giữ ý nghĩa rằng D một A

+1

'D' là một' A' trong cả hai trường hợp, bởi vì 'b' là một ' A', không? –

+0

Chắc chắn nó là, nhưng tôi đang nói về ý nghĩa ** mở rộng ** (ngữ nghĩa). Phần mở rộng gần giống với ** là ** so với mixin, có thể nói ** như **. Hãy suy nghĩ về cách xử lý các Bộ sưu tập bài đăng 2,8, trong đó các Đặc điểm mới đã được tạo để chứa thực hiện chức năng Thu thập như (foreach). Đó là tên SeqLike, TraversableLike một như vậy –

+0

cảm ơn rất nhiều :) – takhirata

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