xem xét lớp học này rất đơn giản:Làm thế nào tôi có thể xây dựng một cá thể ẩn danh của một loại chung?
class MyClass(p: (String, String) *) {
val params: Map[String, String] = p.toMap
}
Và một lớp mà kéo dài nó:
class SomeOtherClass(p: (String, String) *) extends MyClass(p: _*)
Tôi muốn loại bỏ các nhà xây dựng từ MyClass
để tránh mang theo các thông số khởi tạo trong tất cả mọi thứ mà kéo dài nó (nhiều loại tiềm năng). Thay vào đó, tôi muốn các đối tượng đồng hành của các loại mở rộng MyClass
để kế thừa một số loại phương thức trình xây dựng.
class MyClass {
val param = Map.empty[String, String] // some member with a default value
}
trait MyClassBuilder[A <: MyClass] {
def apply(p: (String, String) *): A = ???
}
Về cơ bản apply
nên làm một cái gì đó như thế này:
new A {
override val param = p.toMap
}
Rõ ràng, các mã trên không thể làm việc. Ý tưởng là một sub-type sẽ được sử dụng như thế này:
class SomeOtherClass extends MyClass
object SomeOtherClass extends MyClassBuilder[SomeOtherClass] {
// object specific things..
}
Sau đó SomeOtherClass
sẽ dựa vào sự thừa hưởng apply
phương pháp để tạo thể hiện của bản thân. Có vẻ như một cái gì đó như thế này có thể là có thể với sự phản ánh hoặc macro, nhưng tôi thực sự không có ý tưởng. Để rõ ràng, tôi muốn mã máy khách như SomeOtherClass
không yêu cầu hàm tạo nào cả, đó là lý do tại sao tôi muốn khám phá việc tạo các lớp ẩn danh trên một kiểu chung. Có thể không phải là SomeOtherClass
được tạo, nó có thể là bất cứ thứ gì mở rộng MyClass
.
tôi đặt cược một macro là cách để đi ở đây, mà sẽ sản xuất các boilerplate bạn đang cố gắng để tránh –