7

考虑:

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

那么在施工现场或申报现场使用 trait 有什么不同呢?在类的声明中扩展/使用特征时,我可以有第一个行为(可堆叠特征)吗?

4

2 回答 2

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
*/
于 2012-09-17T16:50:44.117 回答
2

在第一个示例中,您覆盖了Basefirst 的方法,然后您混合TraitA了将堆栈的方法。

在第二个示例中,首先混合TraitA,然后覆盖生成的(堆叠)方法。

于 2012-09-17T16:34:04.317 回答