2011-08-29 13 views
17

Esto no funciona:La herencia de un rasgo en dos ocasiones

trait Trait 
class Class extends Trait with Trait 

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:

  • W ¿Por qué funciona?
  • ¿En qué se diferencia el segundo fragmento? (en relación con el problema de la herencia doble)
  • ¿El segundo fragmento o patrón de alguna manera es útil?
+0

¿Tiene un ejemplo práctico en el que es un problema real que el primero no funciona? – Jesper

+1

El propósito de la pregunta no es averiguar por qué el primero no funciona, sino más bien por qué el segundo sí lo hace. – agilesteel

+1

Enlace útil: [capítulo de Programación en Scala] (http://www.artima.com/pins1ed/traits.html#i-1280910181-1) que muestra cómo funciona la linealización. – 4e6

Respuesta

19

El segundo fragmento funciona debido a la linealización del rasgo. 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 

Ver this chapter de programación Scala para una gran explicación.

Esto se hace principalmente para tener un enfoque coherente del problema de la herencia del 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 no se permita.

+0

La respuesta es muy antigua, por lo que Scala cambió este comportamiento, pero ahora parece que está mal. Linealización debe ser: Implementación, Abstracción, Rasgo, ... – kpbochenek

Cuestiones relacionadas