我的特质中有一个方法
def controller: AnyRef
但我的具体类没有实现该方法,它仍然在编译。编译器也不允许我向该方法添加抽象。如何在特征中创建一个方法,迫使它的实现者实现它?
感谢, 迪安
答案 0 :(得分:5)
编译器强制执行具体的类实现它们从超类和特征继承的所有摘要方法。
如果你的班级正在编译它意味着它不具体,即它是trait
或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
答案 1 :(得分:1)
如果您没有收到任何编译错误,我认为您的IDE有问题,请尝试刷新/清理您的项目。
如果你的特性实现了“控制器”功能,那么扩展特性的具体类(非抽象类)需要不具有“控制器”功能的任何实现。这就是Scala中 trait的优点,而不是强迫所有具体类实现一些具有相同实现的常用方法。
答案 2 :(得分:0)
当你有一个具有
的具体子类时val controller = new Controller
它似乎影响了traits控制器并让你的trait调用控制器返回null。一切都编译得很好(虽然我认为这可能是一个scala bug,因为我不认为应该实际编译)。
如果它应该编译,那么有人可以解释它编译的原因。