Šajā rakstā jūs uzzināsiet par Sealed klasi, kā tās tiek izveidotas un kad tās izmantot, izmantojot piemērus.
Aizvērtās klases tiek izmantotas, ja vērtībai var būt tikai viens no veidiem no ierobežotas kopas (ierobežotas hierarhijas).
Pirms iedziļināties detaļās par aizzīmogotajām klasēm, izpētīsim, kādu problēmu tās atrisina. Ņemsim piemēru (ņemts no Kotlin oficiālās vietnes - Sealed klases raksts):
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") )
Iepriekš minētajā programmā Expr bāzes klasei ir divas atvasinātas klases Const (apzīmē skaitli) un Sum (apzīmē divu izteicienu summu). Šeit else
izteiksmē noklusējuma nosacījumam obligāti jāizmanto filiāle.
Ja tagad no Expr
klases iegūstat jaunu apakšklasi , kompilators neko neatrod, jo else
filiāle to apstrādā, kas var izraisīt kļūdas. Būtu bijis labāk, ja kompilators izdotu kļūdu, kad pievienojām jaunu apakšklasi.
Lai atrisinātu šo problēmu, varat izmantot aizzīmogotu klasi. Kā minēts, aizzīmogotā klase ierobežo iespēju izveidot apakšklases. Ja when
izteiksmē apstrādājat visas aizzīmogotās klases apakšklases, nav nepieciešams izmantot else
atzarojumu.
Lai izveidotu aizzīmogotu klasi, tiek izmantots aizzīmogots modifikators. Piemēram,
aizzīmogotā klase Izpr
Piemērs: noslēgta klase
Lūk, kā jūs varat atrisināt iepriekš minēto problēmu, izmantojot aizzīmogotu klasi:
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 )
Kā redzat, else
filiāles nav . Ja no Expr
klases iegūstat jaunu apakšklasi , kompilators sūdzas, ja vien apakšklase netiek apstrādāta when
izteiksmē.
Dažas svarīgas piezīmes
- Visas aizzīmogotās klases apakšklases jādeklarē tajā pašā failā, kur deklarēta aizzīmogotā klase.
- Aizzīmogotā klase pati par sevi ir abstrakta, un jūs nevarat no tās objektus izcelt.
- Jūs nevarat izveidot noslēgtus klases privātus konstruktorus; to konstruktori ir
private
pēc noklusējuma.
Atšķirība starp Enum un Sealed Class
Enum klase un aizzīmogotā klase ir diezgan līdzīgas. Enum tipa vērtību kopa ir ierobežota tāpat kā aizzīmogotā klase.
Vienīgā atšķirība ir tā, ka enum var būt tikai viens gadījums, turpretim aizzīmogotās klases apakšklasē var būt vairāki gadījumi.