trait swal pattern not mixin companion classes basics scala mixins traits

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