scala inheritance linearization

scala - Heredando un rasgo dos veces



inheritance linearization (1)

Esto no funciona:

trait Trait class Class extends Trait with Trait

El compilador se queja:

<console>:8: error: trait Trait is inherited twice class Class extends Trait with Trait ^ <console>:8: error: trait Trait is inherited twice class Class extends Trait with Trait ^

Esto hace:

trait Trait class Abstraction extends Trait class Implementation extends Abstraction with Trait

Preguntas:

  • ¿Por qué funciona?
  • ¿En qué se diferencia el segundo fragmento? (referente a la doble herencia)
  • ¿Es el segundo fragmento o patrón de alguna manera útil?

El segundo fragmento funciona debido a la linealización de rasgos. El compilador organizará los rasgos en una lista lineal para que Trait solo aparezca una vez. Creo que la linealización es.

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

Vea este capítulo de Programación Scala para una gran explicación.

Esto se hace principalmente para tener un enfoque consistente al problema de la herencia de diamante y es útil en ese caso.

Dado que Trait no puede aparecer dos veces después de la linealización, no tiene sentido escribir Trait with Trait y tiene sentido que sea desestimado.