I denne artikel lærer du om forseglet klasse, hvordan de oprettes, og hvornår de skal bruges ved hjælp af eksempler.
Forseglede klasser bruges, når en værdi kun kan have en af typerne fra et begrænset sæt (begrænsede hierarkier).
Inden vi går i detaljer om forseglede klasser, lad os undersøge, hvilket problem de løser. Lad os tage et eksempel (taget fra det officielle Kotlin-websted - Artiklen om forseglede klasser):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
I ovenstående program har basisklassen Expr to afledte klasser Const (repræsenterer et tal) og Sum (repræsenterer summen af to udtryk). Her er det obligatorisk at bruge else
filial til standardbetingelse i når udtryk.
Nu, hvis du udleder en ny underklasse fra Expr
klassen, registrerer compileren ikke noget, da else
grenen håndterer det, der kan føre til fejl. Det ville have været bedre, hvis compileren udsendte en fejl, da vi tilføjede en ny underklasse.
For at løse dette problem kan du bruge forseglet klasse. Som nævnt begrænser forseglet klasse muligheden for at oprette underklasser. Og når du håndterer alle underklasser af en forseglet klasse i et when
udtryk, er det ikke nødvendigt at bruge else
gren.
For at oprette en forseglet klasse anvendes forseglet modifikator. For eksempel,
forseglet klasse Ekspr
Eksempel: Forseglet klasse
Her er hvordan du kan løse ovenstående problem ved hjælp af forseglet klasse:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Som du kan se, er der ingen else
gren. Hvis du udleder en ny underklasse fra Expr
klassen, klager kompilatoren, medmindre underklassen håndteres i when
udtrykket.
Få vigtige bemærkninger
- Alle underklasser af en forseglet klasse skal deklareres i den samme fil, hvor forseglet klasse er deklareret.
- En forseglet klasse er abstrakt i sig selv, og du kan ikke instantiere objekter fra den.
- Du kan ikke oprette ikke-private konstruktører af en forseglet klasse; deres konstruktører er
private
som standard.
Forskellen mellem enum og forseglet klasse
Enum klasse og forseglet klasse er ret ens. Værdisættet for en enumtype er også begrænset som en forseglet klasse.
Den eneste forskel er, at enum kun kan have en enkelt forekomst, mens en underklasse af en forseglet klasse kan have flere forekomster.