un tratto sigillato è uguale a una classe sigillata?
Per quanto riguarda sealed, sì. Condividono le normali differenze tra traite class, ovviamente.
O, in caso contrario, quali sono le differenze?
Moot.
Quando è una buona idea usare un tratto sigillato (e quando no)?
Se si dispone di una sealed class X, è necessario verificare la presenza di Xeventuali sottoclassi. Lo stesso non vale per sealed abstract class Xo sealed trait X. Quindi potresti farlo sealed abstract class X, ma è molto più prolisso che solotrait e per poco vantaggio.
Il vantaggio principale dell'utilizzo di un abstract classover a traitè che può ricevere parametri. Tale vantaggio è particolarmente rilevante quando si utilizzano le classi di tipi. Supponiamo che tu voglia costruire un albero ordinato, per esempio. Puoi scrivere questo:
sealed abstract class Tree[T : Ordering]
ma non puoi farlo:
sealed trait Tree[T : Ordering]
poiché i limiti di contesto (e i limiti di visualizzazione) sono implementati con parametri impliciti. Dato che i tratti non possono ricevere parametri, non puoi farlo.
Personalmente, preferisco sealed traite lo uso a meno che qualche motivo particolare non mi faccia usare a sealed abstract class. E non sto parlando di ragioni impercettibili, ma di ragioni che non puoi ignorare, come usare le classi di tipo.