Kotlina aizzīmogotās klases

Š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 elseizteiksmē noklusējuma nosacījumam obligāti jāizmanto filiāle.

Ja tagad no Exprklases iegūstat jaunu apakšklasi , kompilators neko neatrod, jo elsefiliā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 whenizteiksmē apstrādājat visas aizzīmogotās klases apakšklases, nav nepieciešams izmantot elseatzarojumu.

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, elsefiliāles nav . Ja no Exprklases iegūstat jaunu apakšklasi , kompilators sūdzas, ja vien apakšklase netiek apstrādāta whenizteiksmē.

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 privatepē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.

Interesanti raksti...