2

我有一个抽象方法和具体实现方法的特征,所以是这样的:

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

现在我混合特征:

class MyClass extends BaseClass with MyTrait {

}

BaseClass 不实现抽象方法。当我混合特征时,我希望 scala 编译器强制执行抽象方法(就像 Java 接口一样)。但是没有编译器错误。

我的特殊情况更复杂。我还无法测试运行时会发生什么。

  1. 为什么scala编译器不强制执行抽象方法?
  2. 我可以让 scala 编译器强制执行抽象方法吗?
  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 回答