Trong khi đây không phải là một câu trả lời trực tiếp cho câu hỏi ban đầu, nó có thể hữu ích cho độc giả trong tương lai. Từ Wikipedia:
Scala cho phép kết hợp trong một đặc điểm (tạo kiểu ẩn danh) khi tạo phiên bản mới của lớp.
Điều này có nghĩa là with
có thể sử dụng bên ngoài dòng trên cùng của định nghĩa lớp. Ví dụ:
trait Swim {
def swim = println("Swimming!")
}
class Person
val p1 = new Person // A Person who can't swim
val p2 = new Person with Swim // A Person who can swim
p2
đây có phương pháp swim
sẵn cho nó, trong khi p1
không. Các thực loại p2
là một "ẩn danh", cụ thể là Person with Swim
. Trong thực tế, with
cú pháp có thể được sử dụng trong bất kỳ loại chữ ký:
def swimThemAll(ps: Seq[Person with Swim]): Unit = {
ps.foreach(_.swim)
}
EDIT (2016 12 tháng 10): Chúng tôi đã phát hiện ra một điều không minh bạch. Phần sau sẽ không biên dịch:
// each `x` has no swim method
def swim(xs: Seq[_ >: Person with Swim]): Unit = {
xs.foreach(_.swim)
}
Có nghĩa là về ưu tiên từ vựng, with
liên kết háo hức. Đó là _ >: (Person with Swim)
, không phải (_ >: Person) with Swim
.
Nguồn
2016-07-18 20:40:06
Cảm ơn, tôi đã quên các đặc điểm trong scala. –
Động từ UML cho mối quan hệ "có" là gì? "có", "bao gồm" ... – Ricardo