Usar un Trait como interfaz en Scala

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:

				
					trait Ruedas:
     def tipoRuedas(): Unit
     def traccion(): Unit
				
			

Esos dos métodos no toman ningún parámetro. Si los métodos que desea definir tomarán parámetros, declárelos como de costumbre:

				
					trait DetalleRuedas:
      def marcaRuedas(marca: String): Unit
      def veltasPorSegundo(velocidad: Double, numSegundos: Int): Unit
				
			

Extendiendo traits

Por otro lado de este proceso, cuando desee crear una clase que extienda un trait, use la palabra clave
extends
:

				
					class Mazda extends Ruedas:
				
			

Cuando una clase extiende varios traits, use extends para el primer trait y separe los traits subsiguientes con comas:

				
					class Mazda extends Ruedas, DetalleRuedas:
				
			

Spark y Scala en Databricks: Big Data e ingeniería de datos

Trabajo desde niveles básicos hasta avanzados con RDD y DataFrame.

Si una clase extiende un trait pero no implementa todos sus métodos abstractos, la clase debe declararse abstract:
				
					abstract class 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.
Entradas creadas 25

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Comienza escribiendo tu búsqueda y pulsa enter para buscar. Presiona ESC para cancelar.

Volver arriba