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?
Respuesta
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.
¿Solo por el bien de la elegancia "el rasgo Foo1 extiende la barra" en lugar de "el rasgo Foo1 extiende Foo"? –
Boris: tiene toda la razón, está escrito tal como está, porque agregué Bar en el último minuto. – extempore
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.
¡Qué maravilloso conjunto de diapositivas obtuvo! – egaga
- 1. ¿Detecta modificaciones concurrentes?
- 2. Modificaciones de la memoria resaltada
- 3. ¿Por qué C++ necesita modificaciones de lenguaje para ser "administrado"?
- 4. Javascript eficiente para modificaciones DOM
- 5. ¿Requiere JSONP modificaciones al servidor?
- 6. bifurcación SVN con modificaciones locales
- 7. modificaciones de cadenas "in situ" en Python
- 8. git checkout combina automáticamente las modificaciones locales
- 9. ¿Las modificaciones de MTU afectan ambas direcciones?
- 10. ¿Cómo puedo manejar modificaciones no negativas?
- 11. Modificaciones de archivo de prueba de unidad
- 12. ¿Qué son las cookies firmadas y por qué son útiles?
- 13. ¿Cómo acelerar las construcciones de xcode sin modificaciones de proyecto?
- 14. ¿Qué son los RFC?
- 15. ¿Qué son los conceptos?
- 16. ¿Qué son los futuros?
- 17. ¿Qué son iteradores, C++?
- 18. ¿Qué son skolems?
- 19. ¿Qué son intrínsecos?
- 20. ¿Qué son ICS_R1 ICS_R2?
- 21. ¿Qué son [] en C#?
- 22. ¿Qué son jQuery valHooks?
- 23. ¿Qué son uri, contentValues
- 24. ¿Qué son las fortunas?
- 25. Subversion: ¿evita que se realicen modificaciones locales en un archivo?
- 26. ¿Cómo detectar las modificaciones de un archivo con TFS?
- 27. Cruisecontrol se bloquea al verificar SVN para modificaciones
- 28. DDD - Modificaciones de objetos secundarios dentro del agregado
- 29. ¿Qué PEP son lecturas obligadas?
- 30. NSComparisonResult y NSComparator: ¿qué son?
El libro lo explica en el capítulo de rasgos. – Rayne