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.