2012-04-18 30 views
8

Tôi muốn ghi đè loại trừu tượng trong đặc điểm <: và không phải với = (như câu trả lời ở đây Scala Upper Bounds : value is not a member of type parameter).Mẫu bánh có loại trừu tượng ghi đè không hoạt động với Loại giới hạn trên

Tôi muốn sử dụng mẫu bánh nhưng điều này không hiệu quả, tôi không hiểu tại sao?

trait A { 
    def ping = println("ping") 
} 

trait Cake { 
    type T 
} 

trait S { this: Cake => 
    type T = A 
    def t: T 
    t.ping 
} 

OK, ví dụ này chạy, nhưng trong trường hợp sử dụng thực tế của tôi, tôi muốn ghi đè loại với <: và không phải với = Nó dường như không thể truy cập vào các chức năng t, tại sao?

trait S { this: Cake => 
    type T <: A 
    def t: T 
    t.ping 
} 

trở lại một lỗi value ping is not a member of S.this.T

Trả lời

15

Đó là một thiếu sót của hệ thống kiểu Scala của. Khi xác định các thành viên trong một mixin, Scala sử dụng hai quy tắc: Thứ nhất, bê tông luôn ghi đè trừu tượng. Thứ hai, Nếu hai thành viên đều là bê tông, hoặc cả hai đều là trừu tượng, thì một thành viên xuất hiện sau đó trong thứ tự tuyến tính sẽ thắng.

Hơn nữa, loại tự của một đặc điểm

trait S { this: C => ... } 

được ngầm tăng cường để

trait S { this: S with C => ... } 

để định nghĩa trong đặc điểm S có thể được truy cập trong S. Trong trường hợp của bạn, đặc điểm S được xem là:

trait S { this: S with Cake => 
    type T = A 
    def t: T 
    t.ping 
} 

Bây giờ, miễn là T là bê tông điều này là tốt vì nó ghi đè ab stract T trong Bánh. Nhưng nếu T là trừu tượng, cái trong Cake cames sau đó theo thứ tự tuyến tính và thắng. Và T đó không có giới hạn trên, vì vậy không có ping thành viên. Một cách để sửa lỗi này là để thay đổi thứ tự tuyến tính bằng cách viết:

trait S { this: Cake with S => 
    type T <: A 
    def t: T 
    t.ping 
} 

Nó sẽ là sạch nếu Scala đã có một quy tắc khác nhau mà nói rằng tất cả những hạn chế của các thành viên loại trừu tượng được sáp nhập trong mixin, thay vì chọn một thành viên duy nhất theo thứ tự tuyến tính. Đó là một thay đổi mà chúng tôi muốn xem xét trong tương lai, nhưng chúng ta cần phải cẩn thận với khả năng tương thích ngược.

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