2012-10-12 67 views
50

Veo que los rasgos en Scala son similares a las interfaces en Java (pero las interfaces en Java extienden otras interfaces, no extienden una clase). Vi an example on SO about traits usage donde un rasgo extiende una clase.¿Por qué un rasgo de Scala puede extender una clase?

¿Cuál es el propósito de esto? ¿Por qué los rasgos pueden extender las clases?

+1

Si lee la respuesta que ha vinculado, verá que los rasgos son muy diferentes a las interfaces, ya que pueden contener implementaciones. –

+2

También le puede interesar la diferencia entre la herencia de rasgos y las anotaciones de tipo propio: http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait- subclases –

+0

Sí, entendí el punto de que los rasgos, a diferencia de las interfaces, pueden contener una implementación parcial de los métodos, pero no estaba seguro del propósito de los rasgos que amplían las clases (como se explica en el ejemplo) – Raj

Respuesta

65

Sí se puede, un trait que se extiende un class pone una restricción en lo que se puede extender classestrait - es decir, todos los classes que se mezclan en que debe extenderse trait que class.

scala> class Foo 
defined class Foo 

scala> trait FooTrait extends Foo 
defined trait FooTrait 

scala> val good = new Foo with FooTrait 
good: Foo with FooTrait = [email protected] 

scala> class Bar 
defined class Bar 

scala> val bad = new Bar with FooTrait 
<console>:10: error: illegal inheritance; superclass Bar 
is not a subclass of the superclass Foo 
of the mixin trait FooTrait 
     val bad = new Bar with FooTrait 
          ^
+13

Interesante. Pero también puede restringir las clases en las que se puede mezclar un rasgo colocando una restricción de tipo en el tipo propio, p. Ej. 'rasgo FooTrait {self: Foo =>}'. ¿Cuándo usarías una técnica versus la otra? – AmigoNico

+0

Scala se vuelve bastante loco con todo el negocio de tipeo. Definitivamente puedo ver que esto podría ser bastante útil, pero ¿alguien puede dar ejemplos concretos? –

+1

@AmigoNico [aquí] (http://stackoverflow.com/q/36945333/2032064) es un ejemplo en el que puede preferir heredar de una clase. – Mifeet

Cuestiones relacionadas