混合在斯卡拉多个性状(Mixing multiple traits in Scala)

2019-07-29 16:45发布

快速注:本教程实例特点和类型:斯卡拉针对Java难民5部分

假设我有特点的学生,工人,报酬过低,和年轻。

我怎么能声明一个类( 不是实例 ),CollegeStudent,所有这些特质?

注:我知道的simplests情况下,如CollegeStudent有一个或两个特点:

class CollegeStudent extends Student with Worker

Answer 1:

这是很容易,声明一个类时,你只是“同向”经常你想使用关键字

class CollegeStudent extends Student with Worker with Underpaid with Young

如果性状改变类的行为特征的顺序也很重要,这一切都取决于你所使用的特征。

此外,如果你不想有它总是使用相同性状的类,你可以在以后使用它们:

class CollegeStudent extends Student
new CollegeStudent with Worker with Underpaid with NotSoYoungAnymore


Answer 2:

我认为,这说明不仅是语法, 而且其角色并性状的排序玩的是非常重要的。 我发现贾森斯沃茨的解释学习Scala (第177页)相当enlightning。

  • Scala的类可以同时扩展多个性状,但JVM类只能扩展一个父类。 Scala编译器通过创建“ 各性状的副本,以形成类和性状的高,单柱层次 ”,被称为线性化的方法解决这个问题。

  • 在此背景下,扩大与相同的字段名多性状会出错,一模一样的“ 如果你是扩展一个类,并提供自己的方法的版本,但没有添加替代关键字 ”。

而且因为它决定继承树的形状,线性顺序确实是把一个很重要的问题。 作为一个实例, class D extends A with B with C (其中,A是A类和B和C是性状)将成为class D extends C extends B extends A 。 下面的几行字,也从书中,说明了完美:

trait Base { override def toString = "Base" }
class A extends Base { override def toString = "A->" + super.toString }
trait B extends Base { override def toString = "B->" + super.toString }
trait C extends Base { override def toString = "C->" + super.toString }
class D extends A with B with C { override def toString = "D->" + super.toString }

要在通话new D()将有REPL打印以下:

 D->C->B->A->Base

这很好地反映了线性继承图的结构。



文章来源: Mixing multiple traits in Scala