2

私は抽象メソッドと具体的な実装メソッドを持つ特性を持っているので、次のようなものです:

trait MyTrait extends BaseClass {
    def myAbstractMethod: MyReturnType
    def myConcreteMethod = { /*implementation*/ }
}

今、私は特性を混ぜ合わせます:

class MyClass extends BaseClass with MyTrait {

}

BaseClassは抽象メソッドを実装していません。トレイトをミックスするときに、scalaコンパイラーが抽象メソッドを(Javaインターフェースのように)実装する必要があることを強制することを期待していました。ただし、コンパイラエラーはありません。

私の特定のケースはもっと複雑です。実行時に何が起こるかをまだテストできませんでした。

  1. なぜscalaコンパイラはabstractメソッドの実装を強制しないのですか?
  2. Scalaコンパイラにabstractメソッドの実装を強制させることはできますか?
  3. 要約を追加するか、どこかでオーバーライドする必要がありますか?
  4. MyClassのインスタンスを作成して使用しようとすると、実行時に何が起こりますか?
4

1 に答える 1

6

間違いなくコンパイラエラーが発生するはずです...

scala> :paste
// Entering paste mode (ctrl-D to finish)

trait MyTrait extends BaseClass {
    def myAbstractMethod: MyReturnType
    def myConcreteMethod = { /*implementation*/ }
}

class MyClass extends BaseClass with MyTrait {    
}


// Exiting paste mode, now interpreting.

<console>:14: error: class MyClass needs to be abstract, since method myAbstractMethod in trait MyTrait of type => MyReturnType is not defined
       class MyClass extends BaseClass with MyTrait {


 ^
于 2012-12-08T18:32:22.423 に答える