我读过一本关于 Scala 的书,里面提到了可堆叠修改 using traits。什么是可堆叠修改它们的用途是什么?
区分可堆叠修改(无论如何在 scala 中使用该术语)的基本品质是“super”根据特征的混合方式动态受到影响,而一般来说 super 是静态确定的目标。
如果你写
abstract class Bar { def bar(x: Int): Int }
class Foo extends Bar { def bar(x: Int) = x }
那么对于 Foo 来说,“超级”将永远是 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
为什么这很有趣?一个说明性示例可能是您想要压缩、加密和数字签名的一些数据。您可能想要压缩然后加密然后签名,或者您可能想要加密然后签名然后压缩,等等。如果您以这种方式设计组件,您可以实例化一个自定义对象,其中包含您想要按照您想要的方式组织的位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)