scala - ¿Qué es un rasgo sellado?
sealed traits (5)
¿Un rasgo sellado es lo mismo que una clase sellada?
En cuanto a lo sealed
va, sí. Ellos 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 una sealed class X
, entonces debe verificar X
y también las subclases. Lo mismo no se sealed abstract class X
sealed trait X
o al sealed trait X
. Por lo tanto, podría sealed abstract class X
, pero eso es mucho más detallado que solo un trait
y para poca ventaja.
La principal ventaja de usar una abstract class
sobre un trait
es que puede recibir parámetros. Esa ventaja es particularmente relevante cuando se usan clases de tipo. 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 se puede hacer eso.
Personalmente, prefiero el sealed trait
y lo uso a menos que alguna razón particular me haga usar una sealed abstract class
. Y no estoy hablando de razones sutiles, sino de razones en su cara que no puede ignorar, como el uso de clases de texto.
Las clases selladas se describen en ''Programación en Scala'', pero los rasgos sellados no lo son. ¿Dónde puedo encontrar más información sobre un rasgo sellado?
Me gustaría saber si un rasgo sellado es lo mismo que una clase sellada. O, si no, ¿cuáles son las diferencias? ¿Cuándo es una buena idea usar un rasgo sellado (y cuándo no)?
Desde el blog de Daily Scala :
Cuando un rasgo está "sellado", todas sus subclases se declaran dentro del mismo archivo y eso hace que el conjunto de subclases sea finito, lo que permite ciertas comprobaciones del compilador.
También siento la necesidad de apuntarte a las especificaciones:
El modificador sellado se aplica a las definiciones de clase. Una clase sellada no se puede heredar directamente, excepto si la plantilla heredada se define en el mismo archivo fuente que la clase heredada. Sin embargo, las subclases de una clase sellada se pueden heredar en cualquier parte.
- M. Odersky. La especificación del lenguaje Scala, versión 2.8. en línea, septiembre de 2013.
brevemente:
- Los rasgos sellados solo pueden extenderse en el mismo archivo
- Listar esto permite al compilador conocer fácilmente todos los subtipos posibles.
- Use rasgos sellados cuando el número de subtipos posibles sea finito y conocido de antemano
- Una forma de crear algo como enum en Java.
- Ayuda para definir tipos de datos algebraicos (TDA)
y para más detalles, todo sobre rasgos sellados en Scala.
Un rasgo sealed
puede extenderse solo en el mismo archivo que su declaración.
A menudo se utilizan para proporcionar una alternativa a las enums
. Dado que solo pueden extenderse en un solo archivo, el compilador conoce todos los subtipos posibles y puede razonar al respecto.
Por ejemplo con la declaración:
sealed trait Answer
case object Yes extends Answer
case object No extends Answer
El compilador emitirá una advertencia si una coincidencia no es exhaustiva:
scala> val x: Answer = Yes
x: Answer = Yes
scala> x match {
| case No => println("No")
| }
<console>:12: warning: match is not exhaustive!
missing combination Yes
Por lo tanto, debe usar rasgos sellados (o clase abstracta sellada) si el número de subtipos posibles es finito y conocido de antemano. Para más ejemplos, puede echar un vistazo a las implementaciones de list y option .