Scala Trait (rasgo)
Scala Trait (rasgo) equivale a una interfaz de Java, pero en realidad es más potente que una interfaz.
A diferencia de las interfaces, también puede definir propiedades e implementaciones de métodos.
En general, las clases de Scala solo pueden heredar de una única clase padre, pero cuando se trata de traits (rasgos), pueden heredar de varios, lo que en la práctica equivale a implementar herencia múltiple.
La forma de definir un Trait (rasgo) es similar a la de una clase, pero la palabra clave que se usa estrait, como se muestra a continuación:
Ejemplo
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
El Trait (rasgo) anterior consta de dos métodos:isEqualyisNotEqual. El método isEqual no define una implementación, mientras que isNotEqual sí define una implementación. La subclase que hereda el rasgo puede implementar los métodos no implementados. Por lo tanto, en realidad, Scala Trait (rasgo) se parece más a una clase abstracta de Java.
A continuación se muestra un ejemplo completo del rasgo:
Ejemplo
* author: Ejemplo
* url:www.example.com
*/
trait Equal {
def isEqual(x: Any): Boolean
def isNotEqual(x: Any): Boolean = !isEqual(x)
}
class Point(xc: Int, yc: Int) extends Equal {
var x: Int = xc
var y: Int = yc
def isEqual(obj: Any) =
obj.isInstanceOf[Point] &&
obj.asInstanceOf[Point].x == x
}
object Test {
def main(args: Array[String]) {
val p1 = new Point(2, 3)
val p2 = new Point(2, 4)
val p3 = new Point(3, 3)
println(p1.isNotEqual(p2))
println(p1.isNotEqual(p3))
println(p1.isNotEqual(2))
}
}
Al ejecutar el código anterior, el resultado es:
$ scalac Test.scala $ scala Test false true true
Orden de construcción de los rasgos
Los rasgos también pueden tener constructores, compuestos por la inicialización de campos y otras declaraciones en el cuerpo del rasgo. Estas declaraciones se ejecutan cuando se construye cualquier objeto que mezcle este rasgo.
Orden de ejecución de los constructores:
- Se llama al constructor de la superclase;
- El constructor del rasgo se ejecuta después del constructor de la superclase y antes del constructor de la clase;
- Los rasgos se construyen de izquierda a derecha;
- En cada rasgo, primero se construye el rasgo padre;
- Si varios rasgos comparten un mismo rasgo padre, el rasgo padre no se construye repetidamente.
- Una vez que se han construido todos los rasgos, se construye la subclase.
El orden de los constructores es el inverso de la linealización de la clase. La linealización es una especificación técnica que describe todos los supertipos de un tipo.
Otras extensiones