Kotlin zapečateni razredi

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 elsepodružnice za privzeti pogoj v izrazu when.

Če zdaj iz Exprrazreda izpeljete nov podrazred , prevajalnik ne bo zaznal ničesar, saj elseveja 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 whenizrazu obravnavate vse podrazrede zapečatenega razreda , ni treba uporabiti elsepodruž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, elsepodružnice ni . Če iz Exprrazreda izpeljete nov podrazred , se bo prevajalnik pritožil, razen če je podrazred obravnavan v whenizrazu.

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 privateprivzeto.

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.

Zanimive Članki...