2012-02-19 15 views
16

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?

+2

Nie można utworzyć instancji cechy. Kiedy mówisz 'nowy T {}' tworzysz anonimowy obiekt, który miesza cechę T. – sschaef

Odpowiedz

1

Nie tworzymy instancję cechy. Cech nie może być utworzony.

Tworzysz instancję anonimowej klasy rozszerzającej tę cechę.

Ogólnie

new __t__ 

jest równoważna

{ class __anonymous__ extends __t__; new __anonymous__ } 

(gdzie __anonymous__ jest świeże nazwa anonimowego klasy, który jest niedostępny dla programu użytkownika). To jest szczegółowe w section 6.10 Instance Creation Expressions of the Scala Language Specification.

Tak więc powodem, dla którego można utworzyć instancję w pierwszym przypadku, jest to, że nie tworzy się instancji cechy (która jest abstrakcyjna), ale obiekt (który nie jest).

W drugim przypadku powodem, dla którego nie można utworzyć instancji, jest to, że jeśli dziedziczy się z czegoś, niezależnie od tego, czy jest to cecha, czy klasa, ostatecznie należy wdrożyć swoje abstrakcyjne metody w łańcuchu dziedziczenia aby utworzyć instancję. W pierwszym przypadku nie ma żadnych abstrakcyjnych metod do wdrożenia.

Samo słowo kluczowe nie ma znaczenia: cechy są niejawnie abstrakcyjne, słowo kluczowe jest zbędne.

+4

Myślę, że masz na myśli, że tworzy on anonimową * klasę *, która ma cechę jako mixin. –

+0

Przepraszam, tak. Obiekt będący instancją klasy anonimowej, która jest podklasą tej cechy. Uff. –