快速注:本教程实例特点和类型:斯卡拉针对Java难民5部分 。
假设我有特点的学生,工人,报酬过低,和年轻。
我怎么能声明一个类( 不是实例 ),CollegeStudent,所有这些特质?
注:我知道的simplests情况下,如CollegeStudent有一个或两个特点:
class CollegeStudent extends Student with Worker
快速注:本教程实例特点和类型:斯卡拉针对Java难民5部分 。
假设我有特点的学生,工人,报酬过低,和年轻。
我怎么能声明一个类( 不是实例 ),CollegeStudent,所有这些特质?
注:我知道的simplests情况下,如CollegeStudent有一个或两个特点:
class CollegeStudent extends Student with Worker
这是很容易,声明一个类时,你只是“同向”经常你想使用关键字
class CollegeStudent extends Student with Worker with Underpaid with Young
如果性状改变类的行为特征的顺序也很重要,这一切都取决于你所使用的特征。
此外,如果你不想有它总是使用相同性状的类,你可以在以后使用它们:
class CollegeStudent extends Student
new CollegeStudent with Worker with Underpaid with NotSoYoungAnymore
我认为,这说明不仅是语法, 而且其角色并性状的排序玩的是非常重要的。 我发现贾森斯沃茨的解释学习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
这很好地反映了线性继承图的结构。