如何强制方法在特质的具体子类中实现

时间:2014-09-04 11:39:14

标签: scala scala-2.9

我的特质中有一个方法

def controller: AnyRef

但我的具体类没有实现该方法,它仍然在编译。编译器也不允许我向该方法添加抽象。如何在特征中创建一个方法,迫使它的实现者实现它?

感谢, 迪安

3 个答案:

答案 0 :(得分:5)

编译器强制执行具体的类实现它们从超类和特征继承的所有摘要方法。

如果你的班级正在编译它意味着它不具体,即它是traitabstract class,你不能强迫它们实现抽象方法。

当然,只要您尝试获取具体实例,编译器就会引发错误,因为该方法未实现。

REPL中的实际例子

scala> trait A { def controller: AnyRef }
defined trait A

scala> trait B extends A
defined trait B

scala> abstract class C extends A
defined class C

scala> class D extends A
<console>:8: error: class D needs to be abstract, since method controller in trait A of type => AnyRef is not defined
       class D extends A

scala> new B { }
<console>:10: error: object creation impossible, since method controller in trait A of type => AnyRef is not defined
              new B { }
                  ^

scala> new C
<console>:10: error: class C is abstract; cannot be instantiated
              new C

答案 1 :(得分:1)

如果您没有收到任何编译错误,我认为您的IDE有问题,请尝试刷新/清理您的项目。

如果你的特性实现了“控制器”功能,那么扩展特性的具体类(非抽象类)需要具有“控制器”功能的任何实现。这就是Scala中 trait的优点,而不是强迫所有具体类实现一些具有相同实现的常用方法。

答案 2 :(得分:0)

好吧,似乎发生了一些奇怪的scala问题。

当你有一个具有

的具体子类时
val controller = new Controller

它似乎影响了traits控制器并让你的trait调用控制器返回null。一切都编译得很好(虽然我认为这可能是一个scala bug,因为我不认为应该实际编译)。

如果它应该编译,那么有人可以解释它编译的原因。