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

Fel*_*mel 7 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")
    }
}
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)

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

Ser*_*nko 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
*/
Run Code Online (Sandbox Code Playgroud)