uma característica selada é igual a uma classe selada?
Na medida do possível sealed
, sim. Eles compartilham as diferenças normais entre trait
e class
, é claro.
Ou, se não, quais são as diferenças?
Discutível.
Quando é uma boa ideia usar uma característica selada (e quando não)?
Se você tiver um sealed class X
, precisará verificar X
as subclasses e todas as subclasses. O mesmo não se aplica a sealed abstract class X
ou sealed trait X
. Então você poderia fazer sealed abstract class X
, mas isso é muito mais detalhado do que apenastrait
e com pouca vantagem.
A principal vantagem de usar um abstract class
over a trait
é que ele pode receber parâmetros. Essa vantagem é particularmente relevante ao usar classes de tipo. Digamos que você queira construir uma árvore classificada, por exemplo. Você pode escrever isto:
sealed abstract class Tree[T : Ordering]
mas você não pode fazer isso:
sealed trait Tree[T : Ordering]
desde que os limites de contexto (e os limites de exibição) sejam implementados com parâmetros implícitos. Dado que as características não podem receber parâmetros, você não pode fazer isso.
Pessoalmente, prefiro sealed trait
e uso a menos que alguma razão em particular me faça usar a sealed abstract class
. E não estou falando de razões sutis, mas de razões que você não pode ignorar, como o uso de classes de tipo.