考虑到:
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")
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
val x = new Child with TraitA
x.something()
Run Code Online (Sandbox Code Playgroud)
我明白了:
Child
TraitA
Run Code Online (Sandbox Code Playgroud)
但如果我使用:
class Child extends Base with TraitA {
override def something() {
println("Child")
}
}
val x = new Child
x.something()
Run Code Online (Sandbox Code Playgroud)
我只得到:
Child
Run Code Online (Sandbox Code Playgroud)
那么在建筑工地或申报地点使用特征有何不同?在类的声明中扩展/使用特征时,我可以拥有第一个行为(可堆叠的特征)吗?
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
*/
Run Code Online (Sandbox Code Playgroud)