2009-05-12 9 views
8

He estado leyendo un libro sobre Scala y hay una mención de modificaciones apilables usando rasgos. ¿Qué son modificaciones apilables y para qué fines están destinados a ser utilizados?¿Qué son modificaciones apilables?

+0

El libro lo explica en el capítulo de rasgos. – Rayne

Respuesta

8

La cualidad fundamental que distingue modificaciones apilables (como la terminología se usa en scala de todos modos) es que el "súper" se influye dinámicamente en función de cómo se mezcla el rasgo, mientras que en general super es un objetivo estáticamente determinado.

Si se escribe

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

luego de Foo "super" siempre habrá bar.

Si se escribe

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

Luego de que las súper método sigue siendo desconocido hasta que se tome la clase.

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 

¿Por qué es esto interesante? Un ejemplo ilustrativo podría ser algunos datos que desea comprimir, encriptar y firmar digitalmente. Es posible que desee comprimir, cifrar y luego firmar, o puede cifrar, firmar, luego comprimir, etc. Si diseña sus componentes de esta manera, puede instanciar un objeto personalizado con exactamente los bits que desea organizar de la manera que desee.

+0

¿Solo por el bien de la elegancia "el rasgo Foo1 extiende la barra" en lugar de "el rasgo Foo1 extiende Foo"? –

+0

Boris: tiene toda la razón, está escrito tal como está, porque agregué Bar en el último minuto. – extempore

1

Miré Real-World Scala presentation donde el término modificaciones apilables también se utiliza. Aparentemente, son rasgos que llaman al súper método al anular, básicamente agregando funcionalidad y no reemplazándola. Entonces, acumula funcionalidad con rasgos, y puede usarse donde en Java a menudo usamos aspectos. El rasgo desempeña el papel de un aspecto, anulando los métodos "interesantes" y agregando la funcionalidad específica, como el registro, etc., y luego llama a súper y "pasa la pelota" al siguiente rasgo de la cadena. HTH.

+0

¡Qué maravilloso conjunto de diapositivas obtuvo! – egaga