我在Scala遇到了一个有趣的场景。似乎我有一个基本特征定义了其他特征,实现找不到基本特征无所谓。
为方便起见,我创建了这个基本特征,我不需要在每次实现时重新定义这些特征。有谁知道为什么这不起作用?
object Base {
trait Create
trait Delete
}
trait BaseTrait {
trait Create extends Base.Create
trait Delete extends Base.Delete
}
object Implementation extends BaseTrait
object Something {
class SomeClass extends Implementation.Create //The trait is not defined.
}
更新
这个问题已经被澄清了一点,以便更准确。 @BrianHsu指出的解决方案是trait
不能被继承。
答案 0 :(得分:2)
这段代码很好:
object Base {
trait Event
trait Command
}
以下街区将遇到麻烦:
trait BaseTrait {
trait Event extends Event
trait Command extends Command
}
但Scala编译器非常清楚地说明了这一点。
test.scala:7: error: illegal cyclic reference involving trait Event
trait Event extends Event
^
test.scala:8: error: illegal cyclic reference involving trait Command
trait Command extends Command
当然你不能这样做,就像你不能在Java中做到以下几点:
class HelloWorld extends HelloWorld
你必须指定你扩展的内容实际上是Base.Event / Base.Command,所以只有你把它写成:
trait BaseTrait {
trait Event extends Base.Event
trait Command extends Base.Command
}
您的代码中的另一个问题是最后一个Something
对象,它完全没有意义:
object Something {
Implementation.Event
Implementation.Commannd
}
所以编译器会给你一个明确的错误信息:
test.scala:14: error: value Event is not a member of object Implementation
Implementation.Event
^
test.scala:15: error: value Commannd is not a member of object Implementation
Implementation.Commannd
很明显,Scala中的特性与Java中的interface
非常相似,你不应该使用它,因为它是一个字段。