什么是可堆叠的修改?

时间:2009-05-12 10:18:26

标签: scala dynamic traits

我一直在读一本关于Scala的书,并且提到了使用 traits 可堆叠修改。什么是可堆叠修改以及它们的用途是什么?

2 个答案:

答案 0 :(得分:8)

区分可堆叠修改的基本质量(无论如何在scala中使用术语)是“超级”根据特征的混合方式动态影响,而一般来说,super是静态确定的目标。

如果你写

abstract class Bar { def bar(x: Int): Int }
class Foo extends Bar { def bar(x: Int) = x }

然后对于Foo“super”将永远是Bar。

如果你写

trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) }

然后对于那种方法,在制作课程之前,超级仍然是未知的。

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

为什么这很有趣?一个说明性示例可能是您要压缩,加密和数字签名的一些数据。您可能希望压缩然后加密然后签名,或者您可能希望加密然后签名然后压缩等。如果您以这种方式设计组件,您可以实例化一个自定义对象,您想要按照您想要的方式组织。

答案 1 :(得分:1)

我查看Real-World Scala presentation,其中还使用了术语可堆叠修改。显然,它是在覆盖时调用super方法的特性,实质上是添加功能而不是替换它。因此,您可以使用特征来累积功能,并且可以在Java中我们经常使用方面的地方使用它。 Trait扮演一个方面的角色,覆盖“有趣”的方法,并添加特定的功能,如记录等,然后调用super和“传递球”到链中的下一个特征。 HTH。

相关问题