に私はこのオーバーライドカリー化関数スカラ
// 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 }
}
}
私はあなたが[このページはScalaのサイト](http://www.scala-lang.org/node/135)に基づいていると思います。残念ながら、それはかなり正確ではありません.Scala仕様の3.3.1節を参照してください。 – rxg