El Mixins es una técnica para la reutilización de código. Como funciona? En scala existen entidades llamadas traits. Los traits son características, similares a las interfaces de java, pero pueden contener código. Código que va a ser reutilizados por las clases que utilicen esta característica. Por supuesto una clase puede utilizar varias características.
Voy a tomar el ejemplo del libro programming scala. Supongamos que queremos modelar la amistad entonces vamos hace un trait llamado Friend.
trait Friend {
val name : String
def listen() = println("Your friend " + name + "is listening")
}
Como se puede ver se declaro el val name, el cual debe ser proveído por la clase que vamos a mixiar. Ahora tenemos que utilizar a Friend, si la clase que utiliza este trait no extiende de ninguna clase podemos utilizar extends, por ejemplo:
class Human(val name: String) extends Friend
Human podría reescribir los métodos de Friend, por ejemplo si extendemos a Human en Man y Woman, estos también pueden reescribir estos métodos.
Cuando una clase extiende de otra clase se debe utilizar la palabra clave with. Con with podemos utilizar varios trait. Veamos la clase Dog:
class Dog(val name:String) extends Animal with Friend {
override def listen = println(name + "'s listening quietly")
}
En el ejemplo reescribimos el método solo para mostrar que se puede reescribir, pero si no es necesario no se debe reescribir.
Ahora podemos utilizar el trait heredado y es más podemos tipar por ese trait como lo hacemos en java con las interfaces:
val john = new Man("John" )
val sara = new Woman("Sara" )
val comet = new Dog("Comet" )
john.listen
sara.listen
comet.listen
val mansBestFriend : Friend = comet
mansBestFriend.listen
También podemos utilizar el Mixins en instancias no solo en clases por ejemplo una clase gato, el gato por naturaleza no es muy amistoso:
class Cat(val name: String) extends Animal
Pero existe un gato llamado snowy que es muy amigable, entonces podemos hacer lo siguiente:
val snowy = new Cat("Snowy" ) with Friend
val friend : Friend = snowy
friend.listen
Mixins es una técnica de reutilización de código que nos provee gran flexibilidad en Scala.