2011-10-11 19 views
6

Trong khi làm việc này như mong đợi:Mixin trong một đặc điểm vào một đối tượng gói hai lần

trait A 
trait B extends A 
object C extends A with B 

Lợi suất sau illegal cyclic reference involving trait B:

package cyclictest { 
    trait A 
    trait B extends A 
} 
package object cyclictest extends A with B 

cứu xem lỗi gì xảy ra ở đó?

+1

Cố gắng kế thừa từ B trước tiên. Nó có thể là trình biên dịch không tuyến tính hóa các lớp cơ sở của đối tượng. – Dirk

+5

@Dirk, đúng vậy, quá dễ dàng để nghĩ về nó ngay từ đầu. Tuy nhiên tôi vẫn tự hỏi nếu nó có mục đích hay một loại lỗi nào đó ?! –

+0

Tôi nghĩ định nghĩa của bạn về một đối tượng gói không thể mở rộng các đặc điểm được định nghĩa trong chính gói đó. Thông số scala nói: "_Các đối tượng gói không nên xác định một thành viên có cùng tên với một trong các đối tượng hoặc các lớp cấp cao nhất được nêu trong gói p. Nếu có tên, hành vi của chương trình hiện chưa được xác định. _ "Tôi nghĩ rằng những gì bạn đang làm để xác định lại các đặc điểm A và B –

Trả lời

2

Lỗi là chính xác. Trình biên dịch giải quyết tên AB với tên đầy đủ, vì vậy những gì typechecker thấy là:

package object cyclictest extends cyclictest.A with cyclictest.B 

Để kiểm tra xem định nghĩa đối tượng gói là chính xác, trình biên dịch cần phải biết tất cả các thành viên của AB, nhưng để biết điều đó, cần biết các thành viên của cyclictest (kể từ AB là thành viên của cyclictest). Tuy nhiên, điều này xảy ra trong khi xác định cyclictest, do đó bạn có một chu kỳ không thể giải quyết được.

Trường hợp đầu tiên vượt qua vì gói cyclictest không kế thừa bất kỳ thứ gì, đây là gói dựa trên thư mục mặc định.

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