Tôi đã theo ấn tượng rằng đâychức năng cà ri Overriding trong Scala
// short syntax
def foo(bar: Bar)(baz: Baz): Quux
là đường cú pháp cho việc này
// long syntax
def foo(bar: Bar): (Baz) => Quux
Nhưng tôi dường như không thể kết hợp cả hai khi nói đến thừa kế. Toàn bộ cây phải được xác định bằng cú pháp ngắn hoặc cú pháp dài; không bao giờ cả hai.
Ví dụ:
case class Context
case class Work
trait ContextualWorker {
def workWithContext(ctxt: Context)(work: Work): Traversable[Work]
}
class ShortConcreteWorker extends ContextualWorker {
override def workWithContext(ctxt: Context)(work: Work) = Nil
}
class LongConcreteWorker extends ContextualWorker {
// error on next line: method workWithContext overrides nothing <-------------
override def workWithContext(ctxt: Context): (Work) => Traversable[Work] = {
val setupCode = 1
{ work => Nil }
}
}
Nếu tôi thay đổi đặc điểm để sử dụng cú pháp dài, sau đó ShortConcreteWorker không biên dịch.
Có lý do nào khiến chúng không thể thay đổi/kế thừa được không? Làm thế nào bạn có được xung quanh nó?
Ngay bây giờ các cách tiếp cận linh hoạt nhất dường như là để xác định cây trong cú pháp dài, có lẽ ủy thác cho một lớp học thực hiện trong ShortConcreteWorker như vậy:
case class Context
case class Work
trait ContextualWorker {
def workWithContext(ctxt: Context): (Work) => Traversable[Work]
}
class ShortConcreteWorker extends ContextualWorker {
override def workWithContext(ctxt: Context) = workWithContextImpl(ctxt)_
private def workWithContextImpl(ctxt: Context)(work: Work) = Nil
}
class LongConcreteWorker extends ContextualWorker {
override def workWithContext(ctxt: Context): (Work) => Traversable[Work] = {
val setupCode = 1
{ work => Nil }
}
}
Tôi đoán bạn đang dựa trên giả định của bạn trên [trang này trên trang Scala] (http://www.scala-lang.org/node/135). Thật không may là nó không hoàn toàn chính xác, xem phần 3.3.1 của thông số kỹ thuật Scala. – rxg