考虑到:
abstract class Base {
def something() = println("Base")
}
trait TraitA extends Base {
abstract override def something() = { super.something(); println("TraitA"); }
}
class Child extends Base {
override def something() {
println("Child")
}
}
然后:
val x = new Child with TraitA
x.something()
我明白了:
Child
TraitA
但如果我使用:
class Child extends Base with TraitA {
override def something() {
println("Child")
}
}
val x = new Child
x.something()
我只得到:
Child
那么在建筑工地或申报地点使用特征有何不同?在类的声明中扩展/使用特征时,我可以拥有第一个行为(可堆叠的特征)吗?
答案 0 :(得分:5)
Scala中的可堆叠特征是指能够混合多个 共同工作以对方法应用多个修改的特征。 这涉及调用super.theMethod并修改其输入和/或 输出。但是在特质的背景下什么是超级?班级(或 特质)特征从何而来?特质正在混合的阶级 成?这取决于!所有混合的特征和所有超类都是 线性化。 super会进一步调用最近的前一个定义 链条。
在你的情况下:
1. super.something()== Child.something()
2. super.something()== Base.something()和Child.something()覆盖整个链
mixin的类型并不重要:
class Child2 extends Child with TraitA
val x2 = new Child2
x2.something()
/*
Child
TraitA
*/
class Child3 extends Base with TraitA
val x3 = new Child3
x3.something()
/*
Base
TraitA
*/
答案 1 :(得分:2)
在第一个示例中,您首先覆盖Base
方法,然后混合将会堆叠的TraitA
。
在第二个示例中,首先混合TraitA
,然后覆盖生成的(堆叠)方法。