sealed
Cecha może być przedłużony tylko w tym samym pliku, co jego deklaracji.
Są często używane jako alternatywa dla enums
. Ponieważ można je rozszerzyć tylko w jednym pliku, kompilator zna wszystkie możliwe podtypy i może o tym uzasadnić.
Na przykład z deklaracją:
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
Kompilator wyśle ostrzeżenie, jeśli dopasowanie nie jest wyczerpujące:
scala> val x: Answer = Yes
x: Answer = Yes
scala> x match {
| case No => println("No")
| }
<console>:12: warning: match is not exhaustive!
missing combination Yes
Dlatego powinieneś używać zapieczętowanych cech (lub zapieczętowanej klasy abstrakcyjnej), jeśli liczba możliwych podtypów jest skończona i znana z góry. Więcej przykładów można znaleźć na liście i implementacjach opcji .
Jeśli chodzi o
sealed
tak, to tak. Dzielą normalne różnice międzytrait
iclass
, oczywiście.Sporny.
Jeśli masz
sealed class X
, musisz sprawdzić,X
jak również wszelkie podklasy. To samo nie dotyczysealed abstract class X
lubsealed trait X
. Więc możesz to zrobićsealed abstract class X
, ale jest to o wiele bardziej szczegółowe niż tylkotrait
i ma niewielką przewagę.Główną zaletą używania
abstract class
atrait
jest to, że może odbierać parametry. Ta zaleta jest szczególnie istotna przy stosowaniu klas typów. Załóżmy na przykład, że chcesz zbudować posortowane drzewo. Możesz to napisać:ale nie możesz tego zrobić:
ponieważ granice kontekstu (i granice widoku) są implementowane z niejawnymi parametrami. Ponieważ cechy nie mogą odbierać parametrów, nie możesz tego zrobić.
Osobiście wolę
sealed trait
i używam go, chyba że jakiś konkretny powód zmusza mnie do używaniasealed abstract class
. I nie mówię o subtelnych powodach, ale o powodach, których nie możesz zignorować, takich jak stosowanie klas typów.źródło
[A: F]
) nie działa tak samo jak ograniczenia wariancji. Przeciwnie, to cukier składniowy wymaga niejawnegoF[A]
zakresu. Zwykle jest używany do przywoływania instancji klasowych w sposób nieco bardziej przejrzysty i łatwiejszy do odczytania niż parametr niejawny ((implicit fa: F[A])
), ale nadal działa dokładnie tak samo pod maską, a jak zauważa Daniel, cechy nie są do zrobienia że.Z codziennego bloga Scala :
źródło
Czuję też potrzebę wskazania specyfikacji:
źródło
krótko:
i po więcej szczegółów Wszystko o zapieczętowanych cechach w Scali
źródło