静态和动态特性mixin之间有什么区别

时间:2012-09-17 14:48:42

标签: scala traits

考虑到:

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

那么在建筑工地或申报地点使用特征有何不同?在类的声明中扩展/使用特征时,我可以拥有第一个行为(可堆叠的特征)吗?

2 个答案:

答案 0 :(得分:5)

  

Scala中的可堆叠特征是指能够混合多个   共同工作以对方法应用多个修改的特征。   这涉及调用super.theMethod并修改其输入和/或   输出。但是在特质的背景下什么是超级?班级(或   特质)特征从何而来?特质正在混合的阶级   成?这取决于!所有混合的特征和所有超类都是   线性化。 super会进一步调用最近的前一个定义   链条。

read full post

在你的情况下:
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,然后覆盖生成的(堆叠)方法。