Puede que esté acostumbrad@ a crear interfaces puras en otros lenguajes, declarando métodos sin implementaciones, y desea usar un trait como interfaz en Scala y luego usar esas interfaces con clases concretas.
En su nivel más básico, los trait de Scala se pueden usar como interfaces anteriores a Java 8, donde define métodos pero no proporciona una implementación para ellos.
Por ejemplo, imagina que quieres escribir código para modelar un auto. Los autos tienen ruedas, por tanto, podría pensar en qué tipo de ruedas tiene el auto y el tipo de tracción de las mismas, por lo que define un trait como este, con dos métodos sin implementación:
Si una clase extiende un trait pero no implementa todos sus métodos abstractos, la clase debe declararse abstract:
abstractclass Mazda extends Ruedas, DetalleRuedas:// no implementa ningún método de Ruedas o DetalleRuedas// por tanto debe ser declarada abstracta
Pero si la clase proporciona una implementación para todos los métodos abstractos de los traits que extiende, se puede declarar como una clase normal:
class Ford extends Ruedas, DetalleRuedas:def tipoRuedas():Unit= println("Regular")def traccion():Unit= println("Delantera")def marcaRuedas(marca:String):Unit= println("Michelin")def veltasPorSegundo(velocidad:Double, numSegundos:Int):Unit= println(s"Rodando a $velocidad km/h por $numSegundos")
Conclusiones
Como se muestra en los ejemplos, en su nivel más básico, los traits se pueden usar como interfaces simples. Luego, las clases extienden los traits usando la palabra clave extends, de acuerdo con las siguientes reglas:
Si una clase extiende un trait, use la palabra clave extends.
Si una clase extiende varios traits, use extends para el primer trait y separe el resto con comas.
Si una clase extiende una clase (o una clase abstracta) y un trait, siempre incluya primero el nombre de la clase (usando extends antes del nombre de la clase) y luego use comas antes de los nombres de los traits adicionales.