用以区别可堆叠修饰(作为术语在使用阶无论如何)的基本品质是"超级"受到影响动态基于所述性状是如何混合,而在一般的超级是静态确定的目标.
如果你写
abstract class Bar { def bar(x: Int): Int }
class Foo extends Bar { def bar(x: Int) = x }
Run Code Online (Sandbox Code Playgroud)
那么对于Foo"超级"将永远是Bar.
如果你写
trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) }
Run Code Online (Sandbox Code Playgroud)
然后对于那个方法,在制作课程之前,super仍然是未知的.
trait Foo2 extends Foo { abstract override def bar(x: Int) = x * super.bar(x) }
scala> (new Foo with Foo2 with Foo1).bar(5)
res0: Int = 30
scala> (new Foo with Foo1 with Foo2).bar(5)
res1: Int = 50
Run Code Online (Sandbox Code Playgroud)
为什么这很有趣?一个说明性示例可能是您要压缩,加密和数字签名的一些数据.您可能要压缩然后加密后再签收,或者您可能要加密后再签收再压缩等,如果你以这种方式设计自己的组件,您可以实例化一个自定义对象与正是你想要组织你想要的方式位.