私は、この例を見てみてください、言葉でこれの非常に良い説明を考え出すことはできません。積み重ねられた特性のスーパーの意味はコールサイトに依存しますか?
trait Base { def foo = "Base" }
trait One extends Base { override def foo = "One <: " + super.foo }
trait Two extends Base { override def foo = "Two <: " + super.foo }
new Base with One with Two {} foo
これは、印刷します。を、私は期待しています。 今、別のレベルを追加しようとしています。そのため、特質を無効にすると、明示的にsuper
を呼び出す必要はありません。このように:ここで
trait Base { def foo = "Base" }
trait Foo extends Base { def bar = foo + " <: " + super.foo }
trait One extends Foo { override def foo = "One" }
trait Two extends Foo { override def foo = "Two" }
new Foo with One with Two {} bar
、最後の行は、最後の1で、それはOne
をスキップしてBase
に直接行く間、それは、One
を意味最初の例super
のように見え、Two <: Base
ので、出力します。
どうしてですか?行動は同じではありませんか?
http://stackoverflow.com/questions/7694600/behaviour-of-super-in-chained-scala-traits and http://stackoverflow.com/questions/27569901/scala-traits-mixin-order-and -super-callが役立つ可能性があります。 –
私は関係をもう一度見ません:最初のものは、オーバーライドされた関数呼び出しについての混乱であり、もう1つは抽象的なテンプレート対コンクリートのimlementationです。 – Dima
私は後者が手掛かりになると思います。具体的ではない。 –