という印象を受けました
// short syntax
def foo(bar: Bar)(baz: Baz): Quux
このための構文シュガーでした
// long syntax
def foo(bar: Bar): (Baz) => Quux
しかし、継承に関しては、2つを混在させることはできないようです。ツリー全体を短い構文または長い構文で定義する必要があります。決して両方ではありません。
例えば:
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 }
}
}
長い構文を使用するように特性を変更すると、ShortConcreteWorker はコンパイルされません。
これらが交換可能/継承可能でない理由はありますか? どうやってそれを回避しましたか?
現在、最も柔軟なアプローチは、ツリーを長い構文で定義することであり、おそらく次のように ShortConcreteWorker の実装クラスに委譲することです。
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 }
}
}