un rasgo sellado es lo mismo que una clase sellada?
Hasta donde sealed
llega, sí. Comparten las diferencias normales entre trait
y class
, por supuesto.
O, si no, ¿cuáles son las diferencias?
Discutible.
¿Cuándo es una buena idea usar un rasgo sellado (y cuándo no)?
Si tiene un sealed class X
, entonces tiene que verificar X
, así como cualquier subclase. Lo mismo no es cierto para sealed abstract class X
o sealed trait X
. Entonces podría hacerlo sealed abstract class X
, pero eso es mucho más detallado que solo trait
y con poca ventaja.
La principal ventaja de usar un abstract class
over a trait
es que puede recibir parámetros. Esa ventaja es particularmente relevante cuando se usan clases de tipos. Digamos que quieres construir un árbol ordenado, por ejemplo. Puedes escribir esto:
sealed abstract class Tree[T : Ordering]
pero no puedes hacer esto:
sealed trait Tree[T : Ordering]
ya que los límites de contexto (y los límites de vista) se implementan con parámetros implícitos. Dado que los rasgos no pueden recibir parámetros, no puedes hacerlo.
Personalmente, lo prefiero sealed trait
y lo uso a menos que alguna razón en particular me haga usar a sealed abstract class
. Y no estoy hablando de razones sutiles, sino de razones que no puedes ignorar, como usar clases de tipos.