scala - resoluciones - metafora juridica ejemplos
Semántica de los rasgos abstractos en Scala. (2)
Me pregunto cuál es la semántica de usar la palabra clave abstract
en combinación con un trait
.
Si el rasgo no define ningún método abstracto, la palabra clave abstract
no me impide crear una instancia:
scala> abstract trait T
defined trait T
scala> new T{}
res0: java.lang.Object with T = $anon$1@12cd927d
Por otro lado, si el rasgo define un método abstracto, no puedo crear una instancia (sin implementar este método, por supuesto) sin importar 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, ¿para qué sirve la palabra clave abstract
frente a un trait
?
No estás creando una instancia del rasgo. Los rasgos no pueden ser instanciados.
Estás creando una instancia de una clase anónima que extiende el rasgo.
En general,
new __t__
es equivalente a
{ class __anonymous__ extends __t__; new __anonymous__ }
(donde __anonymous__
es un nombre nuevo de una clase anónima que no es accesible para el programa del usuario).
Esto se detalla en la sección 6.10 Expresiones de creación de instancias de la especificación del lenguaje Scala .
Entonces, la razón por la cual 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 lugar a lo largo de la cadena de herencia para crear una instancia. . En el primer caso, no hay métodos abstractos para implementar.
La palabra clave abstract
sí no hace ninguna diferencia: los rasgos son implícitamente abstractos, la palabra clave es redundante.
No tiene efecto, los rasgos son automáticamente abstractos.
El modificador abstracto se usa en las definiciones de clase. Es redundante para los rasgos y obligatorio para todas las demás clases que tienen miembros incompletos.