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
trait Shapedejanameyareaabstractos y luego definedescribeen función de ellos.case class Circleycase class Rectaportan los dos miembros abstractos y heredan el resto.val shapes: List[Shape]guarda ambos tipos, yshapes.map(_.describe)llega alareacorrecto de cada uno.
Palabras clave y builtins usados aquí
caseclassdefextendstraitval
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.
Paso 1 de 3 en Traits y extensiones; paso 22 de 27 en Fundamentos del lenguaje.