0

このコードを考えると:(あまり意味がないかどうかに関係なく)

    object Test {

          def main(args: Array[String]) {
           (new FooImpl2()).foo()
          }

          trait Foo {
            def foo()
          }

          trait M extends Foo {
            abstract override def foo() {println("M"); super.foo()}
          }

          abstract class FooImpl1 extends Foo {

          }

          class FooImpl2 extends FooImpl1 with M{
            override def foo() {println("Impl2")}
          }

    }

コンパイル時に、次のエラーが発生します。

error: overriding method foo in trait M of type ()Unit;
method foo needs `abstract override' modifiers
override def foo() {println("Impl2")}

だからこの場所で:

class FooImpl2 extends FooImpl1 with M{
    override def foo() {println("Impl2")}
}

なぜoverride適用されないFooImpl1のですか(抽象特性メソッドの具体的な実装を提供するため)?代わりに特性メソッドと一致しているようです...そして明らかにパターン" abstract override"との大きな競合があります

4

1 に答える 1

1

Mは、具体的なdefの後に(線形化の順序で)ミックスインする必要があります。

于 2012-12-12T17:31:58.873 に答える