Tất cả ba biểu mẫu đều hợp lệ và có hiệu lực là B
được giả định là loại this
trong lớp A
.
Hai biến thể đầu tiên
trait A { self: B => ... }
trait A { foo: B => ... }
giới thiệu self
(tương ứng, foo
) như là một bí danh cho this
trong đặc điểm A
. Điều này rất hữu ích khi truy cập tham chiếu this
từ một lớp bên trong. I E. sau đó bạn có thể sử dụng self
thay vì A.this
khi truy cập vào tài liệu tham khảo this
về đặc điểm A
từ một lớp được lồng trong nó. Ví dụ:
class MyFrame extends JFrame { frame =>
getContentPane().add(new JButton("Hide") {
addActionListener(new ActionListener {
def actionPerformed(e: ActionEvent) {
// this.setVisible(false) --> shadowed by JButton!
frame.setVisible(false)
}
})
})
}
Các biến thể thứ ba,
trait A { this: B => ... }
không giới thiệu một bí danh cho this
; nó chỉ thiết lập kiểu tự.
Nguồn
2010-10-25 21:25:55
Cách tôi xem xét loại tự là đặc điểm tự khai báo là lấy một loại nhất định và trả lại khối mã, ví dụ: foo: B => {...}. Bây giờ những curlies tất nhiên là bỏ qua. Thật thú vị khi thấy rằng bạn có thể sử dụng tên đối tượng thay vì "này" bên trong bất kỳ phạm vi nào trong mã mặc dù [một cái gì đó chúng tôi làm mọi lúc trong javascript] –
@Martin Odersky Có thể thêm hạn chế cho hai hoặc nhiều đặc điểm, một cái gì đó như 'đặc điểm A {self: B, C => ...}'? –
@DmitryBespalov: Có, bạn có thể sử dụng từ khóa 'with' trong chú thích tự đánh máy. Ví dụ, 'trait A {self: B với C => ...} ' – Dave