2009-05-12 13 views
8

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

+0

Книга объясняет это в главе о признаках. – Rayne

ответ

8

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

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

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

то для Foo "супер" всегда будет бар.

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

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 

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

+0

Просто ради элегантности «черта Foo1 расширяет бар» вместо «черты Foo1 extends Foo»? –

+0

Борис - ты абсолютно прав, он написан только так, потому что я добавил Бар в последнюю минуту. – extempore

1

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

+0

Какой замечательный набор слайдов он получил! – egaga