2012-02-19 16 views
16

Me pregunto cuál es la semántica del uso de la palabra clave abstract en combinación con un trait.Semántica de rasgos abstractos en Scala

Si el rasgo no define ningún método abstracto, la palabra clave abstract no me impide la creación de una instancia:

scala> abstract trait T 
defined trait T 

scala> new T{} 
res0: java.lang.Object with T = [email protected] 

Por otro lado, si el rasgo sí define un método abstracto, no puedo crear una instancia (sin implementar este método, por supuesto), no importa si la palabra clave abstract está presente o no:

scala> abstract trait T { def foo : Unit } 
defined trait T 

scala> new T{} 
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined 
       new T{} 
       ^

scala> trait T { def foo : Unit } 
defined trait T 

scala> new T{} 
<console>:9: error: object creation impossible, since method foo in trait T of type =>  Unit is not defined 
       new T{} 
       ^

Entonces, ¿cuál es la palabra clave abstract frente a un trait bueno para?

+2

No puede crear una instancia de un rasgo. Cuando dices 'new T {}' creas un objeto anónimo que mezcla el rasgo T. – sschaef

Respuesta

1

usted no está creando una instancia del rasgo. Los rasgos no pueden ser instanciados.

Está creando una instancia de una clase anónima que amplía la característica.

En general,

new __t__ 

es equivalente a

{ class __anonymous__ extends __t__; new __anonymous__ } 

(donde __anonymous__ es un nombre fresco de una clase anónima que es inaccesible para el programa de usuario).

Esto se detalla en section 6.10 Instance Creation Expressions of the Scala Language Specification.

Por lo tanto, la razón por la que puede crear una instancia en el primer caso, es porque no está creando una instancia del rasgo (que es abstracto) sino un objeto (que no lo es).

En el segundo caso, la razón por la que no puede crear una instancia es que si hereda de algo, ya sea un rasgo o una clase, finalmente tiene que implementar sus métodos abstractos en algún punto de la cadena de herencia en para instanciarlo. En el primer caso, no hay métodos abstractos para implementar.

La palabra clave abstract en sí misma no hace ninguna diferencia: los rasgos son implícitamente abstractos, la palabra clave es redundante.

+4

Creo que quieres decir que está creando una * clase * anónima, que tiene el rasgo de mixin. –

+0

Lo siento, sí. Un objeto que es una instancia de una clase anónima que es una subclase del rasgo. Uf. –

Cuestiones relacionadas