un tratto sigillato è uguale a una classe sigillata?
Per quanto riguarda sealed
, sì. Condividono le normali differenze tra trait
e 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 X
eventuali sottoclassi. Lo stesso non vale per sealed abstract class X
o 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 class
over 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 trait
e 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.