考虑:
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
那么在建筑工地和声明工地使用特征有什么区别呢?当我在类的声明中扩展/使用特征时,我可以有第一个行为(堆叠特征)吗?
发布于 2012-09-18 00:50:44
Scala中的
可堆叠特征指的是能够混合在一起工作的多个特征,以对一个方法应用多个修改。这涉及到调用super.theMethod并修改其输入和/或输出。但是,在性状的背景下,什么是超级呢?特征从哪一类(或特征)延伸而来?将特征混合到哪个类中?那得看情况!所有混合特征和所有超类都是线性化的。super调用链条上最接近的前面的定义。
read full post
在您的案例中:
混入类型无关紧要:
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
*/
发布于 2012-09-18 00:34:04
在第一个示例中,首先覆盖Base
的方法,然后混合将堆叠的TraitA
。
在第二个示例中,首先混合TraitA
,然后覆盖结果(堆叠)方法。
https://stackoverflow.com/questions/12461797
复制相似问题