zapieczętowana cecha jest taka sama jak zapieczętowana klasa?
Jeśli chodzi o sealed
tak, to tak. Dzielą normalne różnice między trait
i 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ć, X
jak również wszelkie podklasy. To samo nie dotyczy sealed abstract class X
lub sealed trait X
. Więc możesz to zrobić sealed abstract class X
, ale jest to o wiele bardziej szczegółowe niż tylko trait
i ma niewielką przewagę.
Główną zaletą używania abstract class
a trait
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ć:
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 trait
i 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.