Zastanawiam się, co to jest semantyka użycia słowa kluczowego abstract
w połączeniu z trait
.Semantyka abstrakcyjnych cech w Scali
Jeżeli cecha nie definiuje żadnych abstrakcyjnych metod, słowo abstract
nie powstrzymuje mnie od tworzenia instancji:
scala> abstract trait T
defined trait T
scala> new T{}
res0: java.lang.Object with T = [email protected]
Z drugiej strony, jeśli cecha czyni zdefiniować metody abstrakcyjne, nie mogę tworzyć instancją (bez realizacji tej metody oczywiście) bez względu na to, czy dane słowo kluczowe abstract
jest obecny czy nie:
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{}
^
Więc co jest abstract
kluczowe przed trait
dobre dla?
Nie można utworzyć instancji cechy. Kiedy mówisz 'nowy T {}' tworzysz anonimowy obiekt, który miesza cechę T. – sschaef