2011-08-29 43 views
17

này không hoạt động:Thừa hưởng một đặc điểm hai lần

trait Trait 
class Class extends Trait with Trait 

Compiler phàn nàn:

<console>:8: error: trait Trait is inherited twice 
     class Class extends Trait with Trait 
         ^
<console>:8: error: trait Trait is inherited twice 
     class Class extends Trait with Trait 
            ^

này không:

trait Trait 
class Abstraction extends Trait 
class Implementation extends Abstraction with Trait 

Câu hỏi:

  • W hy nó ​​có hoạt động không?
  • Đoạn mã thứ hai khác nhau như thế nào? (liên quan đến vấn đề thừa kế đôi)
  • Đoạn mã hoặc mẫu thứ hai có hữu ích không?
+0

Bạn có một ví dụ thực tế mà nó là một vấn đề thực sự mà đầu tiên không hoạt động? – Jesper

+1

Mục đích của câu hỏi là không tìm ra lý do tại sao người đầu tiên không làm việc, mà là lý do tại sao người thứ hai lại không làm việc đó. – agilesteel

+1

Liên kết hữu ích: [chương từ Lập trình trong Scala] (http://www.artima.com/pins1ed/traits.html#i-1280910181-1) cho biết cách hoạt động của tuyến tính. – 4e6

Trả lời

19

Đoạn mã thứ hai hoạt động do tuyến tính trạng thái. Trình biên dịch sẽ tổ chức các đặc điểm thành danh sách tuyến tính để Trait chỉ xuất hiện một lần. Tôi nghĩ tuyến tính hóa là

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any 

Xem this chapter từ Lập trình Scala để được giải thích tuyệt vời.

Điều này chủ yếu được thực hiện để có cách tiếp cận nhất quán với vấn đề kế thừa kim cương và hữu ích trong trường hợp đó.

Trait không thể xuất hiện hai lần sau khi tuyến tính, không có ý nghĩa khi viết Trait with Trait và không có nghĩa là không được phép.

+0

Trả lời là rất cũ nên có lẽ scala thay đổi hành vi này nhưng đối với tôi ngay bây giờ có vẻ như điều này là sai. Tuyến tính hóa phải là: Triển khai, trừu tượng, tra cứu, ... – kpbochenek

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