Что такое стековые модификации? - PullRequest
8 голосов
/ 12 мая 2009

Я читал книгу о Scala, и есть упоминание о составных модификациях с использованием черт . Что такое составные модификации и для каких целей они предназначены?

Ответы [ 2 ]

8 голосов
/ 15 мая 2009

Фундаментальное качество, которое отличает наращиваемые модификации (поскольку терминология в любом случае используется в scala), заключается в том, что на «супер» влияет динамически в зависимости от того, как смешана эта черта, тогда как в общем случае супер является статически определенной целью.

Если вы напишите

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

Почему это интересно? Иллюстративным примером могут быть некоторые данные, которые вы хотите сжать, зашифровать и подписать цифровым способом. Возможно, вы захотите сжать, затем зашифровать, затем подписать, или вы можете захотеть зашифровать, затем подписать, затем сжать и т. Д. Если вы проектируете свои компоненты таким образом, вы можете создать экземпляр настраиваемого объекта с точно такими битами, которые вы хотите организовать так, как вы хотите.

1 голос
/ 13 мая 2009

Я посмотрел на Презентацию Scala в реальном мире , где также используется термин составные модификации . Очевидно, это черты, которые вызывают метод super при переопределении, по существу добавляя функциональность, а не заменяя ее. Таким образом, вы накапливаете функциональность с помощью черт, и ее можно использовать там, где в Java мы часто используем аспекты. Черта играет роль аспекта, переопределяя «интересные» методы и добавляя определенные функции, такие как ведение журнала и т. Д., А затем вызывая super и «передавая мяч», следующей чертой в цепочке. НТН.

...