zapieczętowana cecha jest taka sama jak zapieczętowana klasa?
Jeśli chodzi o sealedtak, to tak. Dzielą normalne różnice między traiti class, oczywiście.
A jeśli nie, jakie są różnice?
Sporny.
Kiedy warto zastosować zapieczętowaną cechę (a kiedy nie)?
Jeśli masz sealed class X, musisz sprawdzić, Xjak również wszelkie podklasy. To samo nie dotyczy sealed abstract class Xlub sealed trait X. Więc możesz to zrobić sealed abstract class X, ale jest to o wiele bardziej szczegółowe niż tylko traiti ma niewielką przewagę.
Główną zaletą używania abstract classa traitjest 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ć:
sealed abstract class Tree[T : Ordering]
ale nie możesz tego zrobić:
sealed trait Tree[T : Ordering]
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 traiti używam go, chyba że jakiś konkretny powód zmusza mnie do używania sealed abstract class. I nie mówię o subtelnych powodach, ale o powodach, których nie możesz zignorować, takich jak stosowanie klas typów.