Sau đây là có thể trong Scala:Scala constructor trừu tượng
scala> val l = List
l: scala.collection.immutable.List.type = [email protected]
scala> l (1, 2, 3)
res0: List[Int] = List(1, 2, 3)
Nói cách khác, Scala có bậc cao đa hình. Tôi muốn sử dụng đa hình bậc cao hơn để làm như sau.
sealed abstract class A { def eval() : A }
case class A0() extends A { ... }
case class A1 (a : A) extends A { ... }
case class A2 (a : A, b : A) extends A { ... }
....
Vì vậy, tôi có một loạt các trường hợp, lớp con của A
, mà nhà thầu không nhất thiết phải lấy cùng số đối số. Tôi cũng muốn có một lớp trường hợp 'chung', một cái gì đó như thế này:
case class ApplyA (c : ???, l : List [ A ]) extends A {
def eval() : A = { ??? } }
Ý tưởng là ApplyA
mất như là đối số đầu tiên một constructor kiếm cái gì đó là một subtype của A
, và một danh sách các đối số. Phương pháp eval
sau đó xây dựng một lớp thích hợp với hàm tạo nếu có thể (nghĩa là danh sách có độ dài phù hợp) và trả về (điều này tương ứng với l (1, 2, 3)
trong ví dụ List
ở trên). Điều gì sẽ là loại đối số của hàm tạo đầu tiên cho ApplyA
?
Điều này có thể xảy ra với đa hình bậc cao hơn, nhưng tôi không thể tìm ra cách thực hiện. Tôi biết rằng tôi có thể làm điều này ngay cả khi không sử dụng đa hình bậc cao bằng cách đơn giản bao bọc các hàm khởi tạo trong các hàm và sau đó truyền các hàm này làm đối số đầu tiên cho hàm dựng cho ApplyA
, nhưng tôi muốn hiểu cách sử dụng đa hình bậc cao trực tiếp.