tuvieran resoluciones que país nuestro metaforas metafora mayor lograría las juridica judiciales estética ejemplos cómo scala abstract traits

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.

http://www.scala-lang.org/docu/files/ScalaReference.pdf