1

I have a method in my trait

def controller: AnyRef

but my concrete class was not implementing that method and it was still compiling. The compiler doesn't let me add abstract to that method either. How can I create a method in a trait that forces it's implementer to implement it?

thanks, Dean

4

3 回答 3

6

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

如果您的类正在编译,则意味着它不是具体的,即它是 atrait或 an abstract 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
于 2014-09-04T11:56:50.203 回答
1

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

如果您的特征具有“控制器”功能的实现,那么具体类(非抽象类)扩展特征不需要任何“控制器”功能的实现。这就是Scala中 trait 的美妙之处,而不是强制所有具体类实现一些具有相同实现的通用方法。

于 2014-09-04T20:57:01.700 回答
0

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

当您有一个具体的子类时

val controller = new Controller

它似乎会影响特征控制器,并且让您的特征调用控制器会导致返回 null。一切都编译得很好(尽管我认为这可能是一个 scala 错误,因为我不“认为”应该实际编译)。

如果它应该编译,那么有人可以解释它为什么编译。

于 2014-09-08T16:42:45.107 回答