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?
No puede crear una instancia de un rasgo. Cuando dices 'new T {}' creas un objeto anónimo que mezcla el rasgo T. – sschaef