假如要快速构建一个混入某些特质的实例,可以使用这个语法:
new Trait1 with Trait2 ... {definition}
这句话界说了一个匿名类,匿名类混入了这些特质。还可以在最前面加上一个想要继承的超类:
new SuperClass with Trait1 with Trait2 ... {definition}
3.4.4特质的线性化叠加计算
最终,需要混入特质进行线性化运算的类G在界说时没有立即混入特质,只是继承了classX,且通过new G with D with E with F with B构建了G的匿名子类的对象。类A是一个抽象类,类X实现了抽象方法m,类G重写了X的m,其余特质也用abstract override重写了m,这保证m最后会回到G。A的m返回类型“String”是必须的。
根据线性化计算公式,我们一步步进行计算。注意类X也就是这个类G继承的类不到场运算,最左边是类本身:G ->,在类的右边写下界说时最后混入的特质,然后往右按照继承顺序写下该特质所有的超类和超特质,全部写完后再写第二个混入的类,以此类推。因此第二个写下的是最后混入的特质B和它的超类:G -> B -> A接着写类F。以此类推,我们写出:
G -> B -> A -> F -> C -> A -> E -> C -> A -> D -> A
之后我们删除其中重复的部分:
G -> B -> F -> E -> C -> D -> A
之后补上AnyRef和Any:
G -> B -> F -> E -> C -> D -> A -> AnyRef -> Any
出发点是B,传入“End”,B输出“B -> End”,之后再传给F,输出“F -> B -> End”,继续向右调用,最后到A时没有操作可以实行,转回G的m,最终得到运行结果是:
G ->D ->C ->E ->F ->B ->End
假如G的m也有super或没有重写,那么会调用X的m,导致最后最左边多一个X,假如在界说G时立即混入特质,则相当于普通的方法重写,假如上一层超类是抽象类,立即引入会报错。