私は形質を拡張するときに、使用するメソッドの実装を選択できます。ここのように:私はそれがだ、自己のタイプと同じことを行いたい場合は、それが不可能なようスカラ。自己型でスーパーメソッドの実装を選択する方法はありますか?
object Main {
def main(args: Array[String]): Unit = {
val c = new C
println(c.a)
println(c.b)
}
trait Parent {
def foo: String
}
trait A extends Parent {
override def foo = "from A"
}
trait B extends Parent {
override def foo = "from B"
}
class C extends A with B {
val b = super[A].foo
val a = super[B].foo
}
}
しかしそうです:これはコンパイルされません
object Main {
def main(args: Array[String]): Unit = {
val c = new C with A with B
println(c.a)
println(c.b)
}
trait Parent {
def foo: String
}
trait A extends Parent {
override def foo = "from A"
}
trait B extends Parent {
override def foo = "from B"
}
class C {
self: A with B =>
val b = super[A].foo
val a = super[B].foo
}
}
。私は正しいとそれは不可能ですか?もし私が正しいのであれば、それはなぜですか、それに対して回避策がありますか?
更新日: なぜ私は最初の場所に必要ですか?私はコンストラクタインジェクションの代わりにセルフタイプを使って依存性インジェクションをして遊んでいました。だから私はベースの特性を持っていたコンバータと子の特性FooConverterとBarConverter。そして、私は(もちろん動作しません)そのようにそれを書きたい:
object Main {
class Foo
class Bar
trait Converter[A] {
def convert(a: A): String
}
trait FooConverter extends Converter[Foo] {
override def convert(a: Foo): String = ???
}
trait BarConverter extends Converter[Bar] {
override def convert(a: Bar): String = ???
}
class Service {
this: Converter[Foo] with Converter[Bar] =>
def fooBar(f: Foo, b:Bar) = {
convert(f)
convert(b)
}
}
}
私はそれがためにジェネリック医薬品のだと思ったが、それはそうではないということになりました。だから、どういうわけか、自分のタイプの選択された形質のスーパーメソッドを呼び出すことが可能かどうかは疑問だった。単純な継承が可能なためです。私の元の問題については、私はこのようにそれを書くことができ、それが動作します:
object Main {
class Foo
class Bar
trait Converter[A] {
def convert(a: A): String
}
trait FooConverter extends Converter[Foo] {
override def convert(a: Foo): String = ???
}
trait BarConverter extends Converter[Bar] {
override def convert(a: Bar): String = ???
}
class Service {
this: FooConverter with BarConverter =>
def fooBar(f: Foo, b:Bar) = {
convert(f)
convert(b)
}
}
}
おそらくタイトな抽象化を、私はそれがこのような状況のために悪いかはわからないと私はコンバータのような幅広い抽象化が必要な場合[A]まったく。
:あなたは
App
オブジェクト(あなたの例ではfoo
はまだval c = new C with A with B
からアクセス可能である)からfooConverter
/barConverter
にアクセスすることができないようこのカプセル化は、自己型ベースのものよりさらに強力です。それは不可能。そして、回避策があるとは思わない(特質に "foos"を追加する以外にも:def AFoo = "from A"; override def foo = aFoo' – Dima
なぜあなたはこれを望む? –
@mz質問 –