scala - pattern - swal.mixin is not a function
Mezclando mĂșltiples rasgos en Scala (2)
Creo que es muy importante explicar no solo la sintaxis, sino también qué papel juega el orden de los rasgos . Encontré la explicación en Learning Scala de Jason Swartz (página 177) bastante esclarecedora.
Una clase Scala puede extender múltiples características a la vez, pero las clases JVM pueden extender solo una clase principal. El compilador de Scala soluciona esto creando " copias de cada rasgo para formar una jerarquía alta de una sola columna de la clase y rasgos ", un proceso conocido como linealización .
En este contexto, la extensión de rasgos múltiples con nombres de campo idénticos no se podría compilar, exactamente igual " como si extendieras una clase y proporcionaras tu propia versión de un método pero no pudieras agregar una palabra clave de anulación ".
Y dado que determina la forma del árbol de herencia, el orden de linealización es de hecho una pregunta muy importante a tener en cuenta. Como ejemplo, la class D extends A with B with C
(donde A es una clase y B y C son rasgos) se convertiría en la class D extends C extends B extends A
Las siguientes líneas, también del libro, ilustran eso perfectamente:
trait Base { override def toString = "Base" }
class A extends Base { override def toString = "A->" + super.toString }
trait B extends Base { override def toString = "B->" + super.toString }
trait C extends Base { override def toString = "C->" + super.toString }
class D extends A with B with C { override def toString = "D->" + super.toString }
Una llamada a la new D()
haría que la REPL imprima lo siguiente:
D->C->B->A->Base
Lo cual refleja perfectamente la estructura del gráfico de herencia linealizado.
Nota rápida: ejemplos del tutorial Scala for Java Refugees Part 5: Traits and Types .
Supongamos que tengo los rasgos Estudiante, Trabajador, Personas mal pagadas y Jóvenes.
¿Cómo podría declarar una clase ( no instancia ), CollegeStudent, con todos estos rasgos?
Nota: conozco los casos más simples, como CollegeStudent con uno o dos rasgos:
class CollegeStudent extends Student with Worker
Es fácil, cuando declaras una clase, solo utilizas la palabra clave "con" tan a menudo como quieras
class CollegeStudent extends Student with Worker with Underpaid with Young
el orden de los rasgos puede ser importante si un rasgo está cambiando el comportamiento de la clase, todo depende de los rasgos que está utilizando.
Además, si no desea tener una clase que siempre use los mismos rasgos, puede usarlos más adelante:
class CollegeStudent extends Student
new CollegeStudent with Worker with Underpaid with NotSoYoungAnymore