9

我一直在阅读一本关于 Scala 的书,其中提到了使用traits进行可堆叠修改。什么是可堆叠的修改,它们的用途是什么?

4

2 回答 2

9

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

如果你写

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) }

然后对于该方法,在创建类之前, 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

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

于 2009-05-14T21:17:57.017 回答
1

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

于 2009-05-12T21:25:58.497 回答