Vì vậy, tôi muốn có một đặc tính chung như một tham số kiểu một lớp với một đối tượng đồng hành kế thừa từ một lớp cơ sở cụ thể và tham chiếu đến cả đối tượng đồng hành và chính lớp đó. Vì vậy,đặc điểm chung là một tham số kiểu
abstract class BaseModel[T] {
def all: Seq[T]
}
case class Customer(email: String, password: String)
object Customer extends BaseModel[Customer]
// This trait is my issue
trait BaseCrud[T] {
def table[T](f: T => String): String = {
T.all.map(f _).mkString("")
}
}
object Controller with BaseCrud {
def foo = table(_.email)
}
Tôi đã có một số giải pháp cho đặc điểm đó gần hơn nhưng tôi chưng cất nó để bạn có thể thấy những gì tôi đang cố gắng làm.
Cảm ơn
CẬP NHẬT
Vì vậy, tôi đã đi với giải pháp từ Frank dưới đây, nhưng tôi đã quản lý để giải quyết câu đố ban đầu của tôi. Mặc dù, trong trường hợp này giải pháp là một chút xấu xí tôi sẽ bao gồm nó ở đây vì lợi ích đầy đủ.
abstract class BaseModel[T] {
def all: Seq[T] = Seq()
}
case class Customer(email: String, password: String)
object Customer extends BaseModel[Customer]
trait BaseCrud[T, U <: BaseModel[T]] {
def table(f: T => String)(implicit obj: U): String = {
obj.all.map(f(_)).mkString("")
}
}
object Controller extends BaseCrud[Customer, Customer.type] {
implicit val model = Customer
def foo = table(_.email)
}
Vì vậy, các thông số loại thay đổi để BaseCrud và tiềm ẩn đã được thêm vào BaseCrud.table và thực hiện tại Controller.model. Tôi cũng sửa tất cả lỗi chính tả của mình. Tôi thấy nó thú vị Customer.type dường như là loại đối tượng đồng hành.
Nhờ công trình nhưng tôi cần BaseModel tôi [T] trộn vào đối tượng khách hàng cho các bộ phận khác của mã này. Nhưng tôi đặt kỹ thuật này để sử dụng trong cùng một mã để truy cập Controller từ BaseCrud [T]. – gimo4000