English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este artículo, aprenderá a través de ejemplos sobre las clases selladas (selladas), cómo crearlas y cuándo usarlas.
Se utilizarán clases selladas cuando el valor solo puede contener un tipo desde un conjunto limitado (jerarquía restringida).
Antes de详细介绍 clases selladas, exploremos los problemas que resuelven. Vamos a dar un ejemplo:
clase Expr clase Const(val valor: Int) : Expr clase Suma(val izquierda: Expr, val derecha: Expr) : Expr fun eval(e: Expr): Int = when(e) { esConstante -e.value esSuma -eval(e.right) + eval(e.left) else -> lanzar IllegalArgumentException("Expresión desconocida") }
En el programa anterior, la clase base Expr tiene dos subclases Const (representa un número) y Suma (representa la suma de dos expresiones). Aquí, es necesario usar la rama else para manejar en la expresión whencondición por defecto.
Ahora, si deriva una nueva subclase de la clase Expr, el compilador no detectará nada, ya que la rama else la manejará, lo que podría llevar a errores. Si el compilador emite un error al agregar una nueva subclase, sería mejor.
Para resolver este problema, se pueden utilizar clases selladas. Como se mencionó anteriormente, las clases selladas limitan la posibilidad de crear subclases. Además, al manejar todas las subclases de una clase sellada en una expresión when, no es necesario utilizar una rama else.
Para crear clases selladas, utilice el modificador sellado sealed. Por ejemplo,
clase sellada Expr
Este es el método para resolver el problema anterior utilizando clases selladas:
clase sellada Expr clase Const(val valor: Int) : Expr() clase Suma(val izquierda: Expr, val derecha: Expr) : Expr() objeto NoEsUnNumero : Expr() fun eval(e: Expr): Int = when(e) { esConstante -e.value esSuma -eval(e.right) + eval(e.left) NoEsUnNumero -java.lang.Double.NaN }
Como puedes ver, no hay rama else. Si derivas una nueva subclase de la clase Expr, el compilador informará a menos que la subclase esté siendo procesada en una expresión when.
Todas las subclases de la clase sellada deben declararse en el mismo archivo donde se declara la clase sellada.
La clase sellada en sí esAbstractoNo puede instanciar un objeto de él.
No se puede crear un constructor no privado para la clase sellada; por defecto, sus constructores son privados.
Clase enumeradaEs muy similar a la clase sellada. El conjunto de valores de tipo de enumeración también está limitado como la clase sellada.
La única diferencia es que las enumeraciones solo pueden tener un único ejemplo, mientras que las subclases de la clase sellada pueden tener múltiples ejemplos.