typestar

Traits en Scala

Un trait fija lo que toda figura debe responder y escribe la parte común una vez.

// A trait can leave members abstract and still define others in terms
// of them, so every implementer inherits describe for free.
trait Shape:
  def name: String
  def area: Double
  def describe: String = f"$name covers $area%.2f"

// A case class supplies the abstract members and nothing more.
case class Circle(radius: Double) extends Shape:
  def name: String = "circle"
  def area: Double = math.Pi * radius * radius

case class Rect(width: Double, height: Double) extends Shape:
  def name: String = "rect"
  def area: Double = width * height

// Typing the List as the trait lets both shapes live in it, and each
// call to describe reaches the right area at run time.
val shapes: List[Shape] = List(Circle(1.5), Rect(2.0, 3.0), Circle(0.5))
val report: List[String] = shapes.map(_.describe)

Cómo funciona

  1. trait Shape deja name y area abstractos y luego define describe en función de ellos.
  2. case class Circle y case class Rect aportan los dos miembros abstractos y heredan el resto.
  3. val shapes: List[Shape] guarda ambos tipos, y shapes.map(_.describe) llega al area correcto de cada uno.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
20
Caracteres a escribir
787
Tokens
130
Ritmo de tres estrellas
75 tpm

Al ritmo de tres estrellas de 75 tokens por minuto, este intento toma unos 104 segundos.

Escribe este fragmento

Paso 1 de 3 en Traits y extensiones; paso 22 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →

Traits en otros lenguajes