Scala特征定义了其他特征

时间:2015-11-16 11:24:13

标签: scala traits

我在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不能被继承。

1 个答案:

答案 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非常相似,你不应该使用它,因为它是一个字段。