V tem članku boste izvedeli več o zapečatenem razredu, kako so ustvarjeni in kdaj jih lahko uporabite s pomočjo primerov.
Zapečateni razredi se uporabljajo, kadar ima vrednost lahko samo enega od tipov iz omejenega nabora (omejene hierarhije).
Preden se lotimo podrobnosti o zapečatenih razredih, raziščimo, kakšen problem rešujejo. Vzemimo primer (povzeto po uradni spletni strani Kotlin - članek o zapečatenih razredih):
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") )
V zgornjem programu ima osnovni razred Expr dva izpeljana razreda Const (predstavlja število) in Sum (predstavlja vsoto dveh izrazov). Tu je obvezna uporaba else
podružnice za privzeti pogoj v izrazu when.
Če zdaj iz Expr
razreda izpeljete nov podrazred , prevajalnik ne bo zaznal ničesar, saj else
veja to obravnava, kar lahko privede do napak. Bolje bi bilo, če bi prevajalnik izdal napako, ko smo dodali nov podrazred.
Da bi rešili to težavo, lahko uporabite zaprti razred. Kot smo že omenili, zaprti razred omejuje možnost ustvarjanja podrazredov. In ko v when
izrazu obravnavate vse podrazrede zapečatenega razreda , ni treba uporabiti else
podružnice.
Za ustvarjanje zapečatenega razreda se uporablja zapečateni modifikator. Na primer
zaprti razred Izraz
Primer: zapečaten razred
Tukaj lahko rešite zgornji problem s pomočjo zapečatenega razreda:
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 )
Kot lahko vidite, else
podružnice ni . Če iz Expr
razreda izpeljete nov podrazred , se bo prevajalnik pritožil, razen če je podrazred obravnavan v when
izrazu.
Nekaj pomembnih opomb
- Vsi podrazredi zapečatenega razreda morajo biti prijavljeni v isti datoteki, kjer je prijavljen zapečateni razred.
- Zapečateni razred je sam po sebi abstrakten in iz njega ne morete ustvariti primerkov.
- Nezasebnih konstruktorjev zapečatenega razreda ne morete ustvariti; njihovi konstruktorji so
private
privzeto.
Razlika med enumom in zapečatenim razredom
Enum in zaprti razred sta si precej podobna. Nabor vrednosti za vrsto enum je prav tako omejen kot zapečaten razred.
Edina razlika je v tem, da ima enum lahko samo en primerek, medtem ko ima podrazred zapečatenega razreda več primerkov.